簡體   English   中英

舊樣式類,新樣式類和元類

[英]Old-style classes, new-style classes and metaclasses

在Python 2.x中,所有新式類都隱式或顯式地從object繼承。 然后看這個:

>>> class M(type):
...     pass
...
>>> class A:
...     __metaclass__ = M
...
>>> class B:
...     pass
...
>>> a = A()
>>> b = B()
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>

這是否意味着A是一種新型類? 但是A仍然不會從object繼承,對嗎?

>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>

好吧, B是經典班,不是嗎?

>>> isinstance(A, object)
True
>>> isinstance(B, object)
True

為什么object AB實例都是實例?

如果Bobject的實例,則type(B)不會是classobj ,對吧?

關於元類,您可以在這里閱讀: http : //docs.python.org/reference/datamodel.html#customizing-class-creation 通常,元類旨在與新樣式類一起使用。 當你寫:

class M(type):
    pass

而您使用:

class C:
    __metaclass__ = M

您將創建一個新樣式對象,因為定義了M的方式(默認實現使用type來創建新樣式類)。 您始終可以實現自己的元類,該元類將使用types.ClassType創建老式的類。

關於插槽,您可以在此處http://docs.python.org/release/2.5.2/ref/slots.html中閱讀片段:

默認情況下,新舊類的實例都具有用於屬性存儲的字典。

對於新型類,您可以添加__slots__ ,然后將不會創建每個對象的字典。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM