我試圖理解Zope接口是如何工作的。我知道Interface只是一個InterfaceClass的實例,它只是一個普通的類。但是如果Interface只是一個類實例,爲什麼它可以被用作基類來繼承?如何實現Zope接口?
例如 Class IFoo(接口): pass
您能否給我一些見解?謝謝。
我試圖理解Zope接口是如何工作的。我知道Interface只是一個InterfaceClass的實例,它只是一個普通的類。但是如果Interface只是一個類實例,爲什麼它可以被用作基類來繼承?如何實現Zope接口?
例如 Class IFoo(接口): pass
您能否給我一些見解?謝謝。
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。
在Zope的接口的實現,存在的代碼的行: 接口= InterfaceClass( 「接口」,__module__ = 'zope.interface') 凡InterfaceClass是一個普通的類。 – Zidadi
@Zidadi你很正確,我的回答是錯誤的,我會看到你得到一個正確的答案。 –
@Zidadi更新瞭解釋InterfaceClass是如何構成元類的。 –