[PYTHON] Eine Geschichte, die von Super (A, Selbst) erschöpft ist

Was ich sagen will

Es ist besser, "super ()" anstelle von "super (A, self)" zu schreiben.

Hintergrund

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

Eine Geschichte, die von Super (A, Selbst) erschöpft ist
Geschichte rund um die Datenanalyse durch maschinelles Lernen
Eine Geschichte über das zufällige Erstellen eines kurzen Songs mit Sudachi Py
Eine Geschichte über eine Tragödie, die durch den Austausch von Befehlen im Chat verursacht wurde
Eine super Einführung in Linux
Was ist ein Superuser?