** 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 |
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__
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.
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
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,
super (). Method_name ()
~~ Addendum: Cela signifie qu'elle contient la méthode de la classe parent Cette expérience confirmée.Si tu ne le tiens pas
Si quelqu'un peut le comprendre, faites-le moi savoir.
Recommended Posts