[英]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.