如果我們有x = type(a)
和x == y
,是否暗示x is y
?classobjects是單身人士嗎?
這裏是一個反例,但它是一個騙子:
>>> class BrokenEq(type):
... def __eq__(cls, other):
... return True
...
>>> class A(metaclass=BrokenEq):
... pass
...
>>> a = A()
>>> x = type(a)
>>> x == A, x is A
(True, True)
>>> x == BrokenEq, x is BrokenEq
(True, False)
我不能創建這樣一個反例:
>>> A1 = type('A',(), {})
>>> A2 = type('A',(), {})
>>> a = A1()
>>> x = type(a)
>>> x == A1, x is A1
(True, True)
>>> x == A2, x is A2
(False, False)
爲了澄清我的問題 - 不覆蓋平等運營商做些瘋狂的事情,一個班級是否有可能存在兩個不同的存儲位置,或者導入系統是否可以防止這種情況?
如果是這樣,我們該如何證明這種行爲 - 例如,用reload或__import__
做奇怪的事情?
如果不是,那是由語言保證或記錄在任何地方?
尾聲:
# thing.py
class A:
pass
最後,這是澄清真實的行爲,我(和它的支持在Blckknght答案索賠)
>>> import sys
>>> from thing import A
>>> a = A()
>>> isinstance(a, A), type(a) == A, type(a) is A
(True, True, True)
>>> del sys.modules['thing']
>>> from thing import A
>>> isinstance(a, A), type(a) == A, type(a) is A
(False, False, False)
所以,儘管代碼使用importlib.reload
的用戶可能會按類標識中斷類型檢查,無論如何也會中斷isinstance
。
有趣的問題!我認爲他們必須這樣做,只是因爲任何給定類型的對象大概只能以一種一致的方式創建。我能否引用某些說法?還沒。 –
因爲python中的所有東西都是對象,所以類是它們元類的「正義」實例 - 爲什麼我們不能擁有「相同」類的其他實例?然而,我沒有找到一個例子,其中導入一個類或以其他方式將一個名稱綁定到該類不只是獲得對同一對象的另一個引用。 – wim
也許這只是在給定實現中碰巧是真實的那些事情之一,但在語言規範中沒有解決,並且不能保證。 –