簡體   English   中英

實例是一個“對象”,但類不是“對象”的子類:這怎么可能?

[英]Instance is an “object”, but class is not a subclass of “object”: how is this possible?

如何讓一個類的實例成為一個object ,而不將該類作為object的子類? 這是一個例子:

>>> class OldStyle(): pass
>>> issubclass(OldStyle, object)
False
>>> old_style = OldStyle()
>>> isinstance(old_style, object)
True

在Python 2中, 類型不是一回事,具體來說,對於舊式類, type(obj)obj.__class__ 不是同一個對象 所以它是可能的,因為舊式類的實例實際上是與它們的類不同的類型( instance ):

>>> class A(): pass
>>> class B(A): pass
>>> b = B()

>>> assert b.__class__ is B
>>> issubclass(b.__class__, A) # same as issubclass(B, A)
True
>>> issubclass(type(b), A)
False

>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.B at 0x10043aa10>

這在新式類中得到解決:

>>> class NA(object): pass
>>> class NB(NA): pass
>>> nb = NB()
>>> issubclass(type(nb), NA)
True
>>> type(nb)
<class '__main__.NB'>
>>> nb.__class__
<class '__main__.NB'>

舊式類不是類型,新式類是:

>>> isinstance(A, type)
False
>>> isinstance(NA, type)
True

聲明舊樣式類已棄用。 在Python 3中,只有新式類; class A()等效於class A(object) ,您的代碼將在兩個檢查中產生True

看一下這個問題,進行更多討論: Python中的舊樣式和新樣式類有什么區別?

一切都是對象:

isinstance(123, object) # True
isinstance("green cheese", object) # True
isinstance(someOldClassObject, object) # True
isinstance(someNewClassObject, object) # True
isinstance(object, object) # True
isinstance(None, object) # True

請注意,這個問題基本上與舊式和新式類無關。 isinstance(old_style, object)True只是python中的每個值都是object實例的必然結果。

當你做表達時

   old_style = OldStyle()

這意味着您要實例化對象,old_style是OldStyle類的實例。

此外,兩者都在Python 3.2中評估為True。

暫無
暫無

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

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