Une histoire épuisée par super (A, self)

Ce que je veux dire

Il vaut mieux écrire «super ()» au lieu de «super (A, self)».

Contexte

Pour une raison quelconque, une classe nommée A doit être déclarée plus d'une fois dans le même module. En gros, ce type de code est écrit.

fool1.py


class A:
    pass

a11 = A()
a12 = A()


class A:
    pass

a21 = A()
a22 = A()

Une définition de classe est, en d'autres termes, la création d'un objet de classe (par «type»), donc les deux classes A sont des objets séparés. Naturellement, ce sera comme ça.

>>> a11.__class__ is a12.__class__
True
>>> a21.__class__ is a22.__class__
True
>>> a11.__class__ is a21.__class__
False
>>> a12.__class__ is a22.__class__
False

J'étais troublé en utilisant «super (A, self)» pour faire des mouvements inattendus sans m'en rendre compte. Par exemple, considérez la définition suivante.

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)

Si vous instanciez A et appelez get_super [123], vous obtenez:

>>> 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>>

Ensuite, après avoir instancié A une fois, redéfinissez A et essayez de même.

>>> 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>>

Seul get_super1 utilisant super (A, self) a une TypeError. La violation de contrainte a probablement été causée par un commutateur dans l'objet référencé par le nom «A» dans le module en cours d'exécution. Pour éviter cela, il est préférable de spécifier l'objet de classe auquel l'objet fait référence, tel que get_super3. Ce n'est pas confirmé, mais je pense que cela se comportera ainsi si l'argument de «super» est omis.

Recommended Posts

Une histoire épuisée par super (A, self)
Histoire de l'analyse de données par apprentissage automatique
Une histoire sur la création d'une courte chanson par hasard avec Sudachi Py
Une histoire sur une tragédie qui se passe en échangeant des commandes dans le chat
Une super introduction à Linux
Qu'est-ce qu'un super utilisateur?