2008-08-29 76 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