2008-08-29 56 views
8

有没有像在其他语言中实现的Python描述符协议?这似乎是一个很好的方式来增加模块化/封装而不会让你的包含类的实现变得更糟,但是我从来没有听说过任何其他语言中的类似事情。由于查找开销,是否可能缺少其他语言?其他语言的Python描述符协议模拟?

回答

4

我还没有听说过直接的等价物。你可能可以用宏实现同样的效果,尤其是像Lisp这样具有非常强大的宏的语言。

如果其他语言开始合并类似的东西,因为它非常强大,我不会感到惊讶。

0

通过为属性指定getter/setter方法,Ruby和C#都可以轻松地创建访问器,这与Python非常相似。但是,这并不是让您自然而然地允许您按照Python允许的方式在另一个类中编写这些方法的代码。在实践中,我不确定这有多重要,因为每次我看到通过描述符协议定义的属性都在同一个类中实现。

编辑:补充我的阅读障碍(我的意思是粗心阅读)。出于某种原因,我总是将“描述符”理解为“修饰符”,反之亦然,即使我是一个打字者​​也是如此。我会留下我的帖子,因为它具有有效的信息,尽管这些信息与问题完全无关。

术语“装饰器”本身实际上是着名的“设计模式”书中描述的设计模式的名称。维基百科文章包含许多用于装饰器使用的不同编程语言的示例:http://en.wikipedia.org/wiki/Decorator_pattern

然而,该文章中的装饰器是面向对象的;他们有实现预定义接口的类,它允许另一个现有类以某种方式表现不同,等等。Python装饰器通过在运行时用另一个函数替换一个函数来起作用,允许你有效地修改/替换该函数,插入代码等。

这在Java世界中称为面向方面的编程,而AspectJ Java编译器允许您执行这些类型的事情并将您的AspectJ代码(它是Java的超集)编译为Java字节码。

我不熟悉C#或Ruby知道他们的装饰器版本是什么。

+0

[描述符协议](http://docs.python.org/ref/descriptors.html)与[装饰模式]不同(http://www.python.org/dev/peps/ pep-0318 /)在Python中 - 我指的是能够将对象实例变为另一个对象的属性,该属性被“代理”为动态。 – cdleary 2008-08-29 19:11:39