Questa è una vecchia questione, ma nessuna delle risposte sembra di dire che. nel caso generale, si IS possibile per una classe di nuovo stile di avere valori diversi per type(instance)
e 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()
uscita:
<class '__main__.ClassB'>
<class '__main__.ClassA'>
ClassB
La ragione è che ClassB
è prevalente l'__class__
descrittore, tuttavia il campo di tipo interno nell'oggetto non viene modificato. type(instance)
legge direttamente da quel campo di tipo, quindi restituisce il valore corretto, mentre instance.__class__
fa riferimento al nuovo descrittore che sostituisce il descrittore originale fornito da Python, che legge il campo del tipo interno. Invece di leggere quel campo di tipo interno, restituisce un valore codificato.
La più grande ironia è il commento di yairchu ora ha lo stesso problema da quando hanno cambiato la formattazione ..: P –
Non sarebbe male mostrare * come * si comportano in modo diverso, e forse anche * perché *. Il solo dire * quando * si comportano in modo diverso suona una risposta pigra, anche se corretta. – MestreLion
vale la pena menzionare questo è solo il problema in Python 2. In Python 3 tutte e tre le espressioni saranno True. – Bob