2010-05-25 45 views
13

我正在學習Python中的元類。我認爲這是一個非常強大的技術,我正在尋找它們的好用途。我希望的一些反饋很有用的現實世界中使用元類的例子。我沒有尋找關於如何編寫元類的示例代碼(這裏有很多無用的元類的例子),但是你已經應用了這個技術的真實例子,它確實是合適的解決方案。規則是:沒有理論上的可能性,但是在實際應用中工作的元類。良好的現實世界的元類使用(例如在Python中)

我會用一個例子開始,我知道:

  • Django模型,爲聲明式編程,其中基礎類模型使用元類,從填補有用的ORM功能的模型對象屬性定義。

期待您的貢獻。

回答

0

SQLalchemy還將它們用於聲明性數據庫模型。

對不起,我的答案和你的例子沒有太大區別,但是如果你正在尋找代碼示例,我發現declarative是非常可讀的。

3

在Python 2.6和3.1中,Python標準庫提供了一個abc.ABCMeta,抽象基類(「ABCs」)的元類。使用元類的類可以使用@abstractmethod和@abstractproperty來定義抽象方法和屬性。元類將確保派生類覆蓋抽象方法和屬性。

另外,實現ABC而不實際繼承它的類可以註冊爲實現接口,以便issubclassisinstance可以工作。

例如,collections模塊定義了Sequence ABC。它還調用Sequence.register(tuple)將內置的tuple類型註冊爲Sequence,儘管tuple實際上並不從Sequence繼承。

0

到目前爲止,我唯一使用元類的時間是編寫一個棄用警告機制。這是大意如下的東西 - 語法可能是非常近似的,但代碼會更容易說明我的觀點不是一個複雜的句子:

class New(object): 
    pass 

class Old(object): 
    def __new__(self): 
    deprecation_warning("Old class is no more supported, use New class instead") 
    return New() 
2

協議緩衝區的Python實現使用元類生成表示數據格式的Python綁定。 From the tutorial

每個班的重要行是__metaclass__ = reflection.GeneratedProtocolMessageType。儘管Python元類的工作細節超出了本教程的範圍,但您可以將它們視爲創建類的模板。在加載時,GeneratedProtocolMessageType元類使用指定的描述符來創建您需要使用每種消息類型所需的所有Python方法,並將它們添加到相關的類中。然後,您可以在代碼中使用完全填充的類。