[英]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
A
和B
實例都是實例?
如果B
是object
的實例,則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.