2011-07-24 118 views
2

我試圖理解Zope接口是如何工作的。我知道Interface只是一個InterfaceClass的實例,它只是一個普通的類。但是如果Interface只是一個類實例,爲什麼它可以被用作基類來繼承?如何實現Zope接口?

例如 Class IFoo(接口): pass

您能否給我一些見解?謝謝。

回答

3

Python是固有地有彈性,並且任何對象可以是一個基類,只要其看起來像基類。和Python一樣,這意味着實現一些預期可以在Python類中找到的屬性。

接口類(或它的基礎規範和元素)設置幾個。尋找以雙下劃線(__)開始獲得的理解的任何變量:

  • __module__:包含蟒路徑組件串。

  • __name__:定義該類的名稱。

  • __bases__:該類的基類。

  • __doc__ :(可選)該類的文檔字符串。

另外,InterfaceClass __init__方法在用作基類時會被調用; Python基本上將基類視爲元類,並且只要我們在類定義中使用基類的類(metaclass),就會創建一個新的實例。這意味着__init__方法將通過新的__name____bases__值,以及所有新的類屬性作爲關鍵字參數(包括__module__和可選的__doc__)。

這是在所有Standard type hierarchy section of the Python Data Model document記載(尋找在特殊屬性「類」段),並且在the same document, in the Customizing class creation section(具有__class__屬性基類被認爲是一個類型)。

所以,任何 Python實例,其限定至少__module____name____bases__屬性,和一個合適的方法__init__將用作其他類的基類。其餘的是Python。

+0

在Zope的接口的實現,存在的代碼的行: 接口= InterfaceClass( 「接口」,__module__ = 'zope.interface') 凡InterfaceClass是一個普通的類。 – Zidadi

+0

@Zidadi你很正確,我的回答是錯誤的,我會看到你得到一個正確的答案。 –

+0

@Zidadi更新瞭解釋InterfaceClass是如何構成元類的。 –