Es ist besser, "super ()" anstelle von "super (A, self)" zu schreiben.
Aus irgendeinem Grund muss eine Klasse mit dem Namen A im selben Modul mehrmals deklariert werden. Diese Art von Code ist ungefähr geschrieben.
fool1.py
class A:
pass
a11 = A()
a12 = A()
class A:
pass
a21 = A()
a22 = A()
Eine Klassendefinition ist mit anderen Worten die Erstellung eines Klassenobjekts (nach Typ), sodass die beiden A-Klassen separate Objekte sind. Natürlich wird es so sein.
>>> a11.__class__ is a12.__class__
True
>>> a21.__class__ is a22.__class__
True
>>> a11.__class__ is a21.__class__
False
>>> a12.__class__ is a22.__class__
False
Ich war beunruhigt, als ich "super (A, self)" verwendete, um unerwartete Bewegungen auszuführen, ohne mir dessen bewusst zu sein. Betrachten Sie beispielsweise die folgende Definition.
class Asuper:
pass
class A(Asuper):
def get_super1(self):
return super(A, self)
def get_super2(self):
return super()
def get_super3(self):
return super(self.__class__, self)
Wenn Sie A instanziieren und get_super [123] aufrufen, erhalten Sie:
>>> a = A()
>>> a.get_super1()
<super: <class 'A'>, <A object>>
>>> a.get_super2()
<super: <class 'A'>, <A object>>
>>> a.get_super3()
<super: <class 'A'>, <A object>>
Nachdem Sie A einmal instanziiert haben, definieren Sie A neu und versuchen Sie dasselbe.
>>> a = A()
>>> class A:
... pass
...
>>> a.get_super1()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in get_super1
TypeError: super(type, obj): obj must be an instance or subtype of type
>>> a.get_super2()
<super: <class 'A'>, <A object>>
>>> a.get_super3()
<super: <class 'A'>, <A object>>
Nur get_super1 mit super (A, self)
hat einen TypeError
. Möglicherweise wurde die Einschränkungsverletzung durch einen Schalter in dem Objekt verursacht, auf das im laufenden Modul mit dem Namen "A" verwiesen wird.
Um dies zu vermeiden, ist es besser, das Klassenobjekt anzugeben, auf das sich das Objekt bezieht, z. B. get_super3. Es ist unbestätigt, aber ich denke, dass es sich so verhalten wird, wenn das Argument "super" weggelassen wird.
Recommended Posts