To stara sprawa, ale żadna z odpowiedzi wydaje się wspomnieć, że. w ogólnym przypadku, JEST możliwe dla klasy nowy styl mieć różne wartości dla type(instance)
i instance.__class__
:
class ClassA(object):
def display(self):
print("ClassA")
class ClassB(object):
__class__ = ClassA
def display(self):
print("ClassB")
instance = ClassB()
print(type(instance))
print(instance.__class__)
instance.display()
wyjściowa:
<class '__main__.ClassB'>
<class '__main__.ClassA'>
ClassB
Powodem jest to, że ClassB
jest przesłanianie __class__
deskryptor, jednak pole typu wewnętrznego w obiekcie nie zostanie zmienione. type(instance)
czyta bezpośrednio z tego typu pola, więc zwraca poprawną wartość, natomiast instance.__class__
odnosi się do nowego deskryptora zastępującego pierwotny deskryptor dostarczony przez Python, który odczytuje pole typu wewnętrznego. Zamiast odczytywać to pole typu wewnętrznego, zwraca wartość zakodowaną na stałe.
Największą ironią jest komentarz yairchu teraz ma ten sam problem, ponieważ zmienili formatowanie: P –
Nie zaszkodzi pokazać * jak * zachowują się inaczej, a może także * dlaczego *. Powiedzenie * kiedy * zachowują się inaczej, brzmi leniwie, nawet jeśli jest poprawna. – MestreLion
Warto wspomnieć, że jest to tylko problem w Pythonie 2. W Pythonie 3 wszystkie trzy wyrażenia będą prawdziwe. – Bob