Python hérite-t-il de méthodes spéciales?

** Environnement d'exécution **

Je vérifie la sortie sur l'interpréteur, donc j'omets print ().

Nom Version
python 3.4.3
ipython 3.1.0

Vérifiez de quoi hériter

Quand j'ai vérifié avec la méthode spéciale «__init __ ()», j'ai confirmé que la super classe «__init __ ()» était exécutée dans la sous-classe non définie. Par précaution, nous vérifions l'héritage en dehors des méthodes spéciales.

class Super():
    super_class_var = 'super_class_value'

    def __init__(self):
        self.super_instance_var = 'super_instance_value'

    @classmethod
    def __super_class_method__(cls):
        print('__super_class_method__')

    def __super_instance_method__(self):
        print('__super_instance_method__')

class Sub(Super):
    pass

\#Vérifier les champs de classe
Sub.super_class_var
\# => 'super_class_value'

Sub.__super_class_method__
\# => <bound method type.__super_class_method__ of <class 'special_method.Sub'> > 
Sub.__super_class_method__()
\# => __super_class_method__

\#Vérification du champ d'instance
sub = Sub()
sub.super_instance_var
\# => 'super_instance_value'

sub.__super_instance_method__
\# => <bound method Sub.__super_instance_method__ of <special_method.Sub object at 0x10dcf0da0> > 
sub.__super_instance_method__()
\# => __super_instance_method__

Si je change dynamiquement les attributs de la classe parent, cela sera-t-il reflété dans la classe enfant?

La réponse est oui!

\#Confirmer en classe
Super.new_var = 'new_var'
Sub.new_var
\# =>  'new_var'
'new_var' in dir(Sub)
\# => True

\#Vérifier avec instance
sub = Sub()
sub.new_var
\# => 'new_var'
'new_var' in dir(sub)
\# => True

Même si vous modifiez les attributs de la classe parent ultérieurement sur l'interpréteur, la classe enfant la reconnaîtra.

Le nom d'attribut hérité est un alias

La classe enfant a-t-elle hérité de méthodes distinctes de celles de la classe parent? Vérifions-le. Le code source est une continuation de la dernière fois.

id(Super.__super_class_method__)
\# => 4381481672
id(Sub.__super_class_method__)
\# => 4381481672
id(sub.__super_class_method__)
\# => 4381481672

id(Super.__super_class_method__) ==\
id(Sub.__super_class_method__)   ==\
id(sub.__super_class_method__)
\# =>  True

L'identifiant (identificateur) de la méthode pointée par tous les noms d'attribut était le même. Vous pouvez voir qu'il n'y a qu'un seul objet pour la méthode de classe __super_class_method__. Le point à noter ici est que le nom d'attribut «super_class_method» n'est pas le même, mais ce nom d'attribut, c'est-à-dire l'identifiant de l'objet pointé par l'étiquette est le même. Vérifions cela dans le code source.

foo = '1'
id(foo)
\# => 4361922800

bar = foo
id(bar)
\# => 4361922800

id(foo) == id(bar)
\# => True

Qu'en est-il de la résolution de noms des noms d'attributs hérités?

Dans cette expérience, nous avons confirmé que la méthode spéciale de la classe parente est également héritée. J'ai également hérité du «method_name» que j'ai défini. Puisque cela et le nom de la méthode spéciale ne sont que des étiquettes, ils sont identiques en termes de noms d'attributs. Cependant, je n'appelle pas cela une méthode spéciale que j'ai définie. Une méthode spéciale est une méthode appelée indirectement sans écrire directement method (). Lorsque vous exécutez un opérateur tel que +, -, <=, la méthode spéciale correspondante est exécutée. Par conséquent, il est possible de modifier le comportement de l'opérateur en réécrivant la méthode spéciale. Pour plus de détails, veuillez consulter le document officiel ci-dessous.

[3. Modèle de données - Document Python 3.4.3](http://docs.python.jp/3/reference/datamodel.html?highlight=%E7%89%B9%E6%AE%8A%E3%83% A1% E3% 82% BD% E3% 83% 83% E3% 83% 89 #noms spéciaux)

Cette expérience a résolu la question ** "Python hérite-t-il de méthodes spéciales?" **. Cependant, de nouvelles questions se sont posées.

Si vous le tenez,

Si tu ne le tiens pas

Si quelqu'un peut le comprendre, faites-le moi savoir.

Recommended Posts

Python hérite-t-il de méthodes spéciales?
Méthodes pratiques de Python, etc.
[python] méthode de base de la classe
Méthodes d'objet chaîne en Python
la version de python ne change pas
Appeler dynamiquement des méthodes en Python
Un codec Python spécial qui semble savoir mais ne sait pas
Définir dynamiquement des fonctions (méthodes) en Python
[Python] Hériter d'une classe avec des variables de classe
Classes et instances Python, méthodes d'instance