l'appel de l'enfant de la méthode de classe de classe parent fichier en python
parent.py
:
class A(object):
def methodA(self):
print("in methodA")
child.py
from parent import A
class B(A):
def methodb(self):
print("am in methodb")
Est-il de toute façon à l'appel methodb()
dans parent.py
?
Si vous avez besoin, c'est une assez importante odeur de code.
Peut-être que je fais mal, mais à la recherche d'autres approche plus intelligente.
Il est difficile de dire ce que l'on pourrait faire mal et comment être plus intelligent, car il n'est pas évident ce que vous êtes en train d'essayer de réaliser en faisant cela. Sonne un peu comme votre problème vient d'une mauvaise approche dans votre programme plus large de la conception...
Peut-être que je fais mal, mais à la recherche d'autres approche plus intelligente.
Il est difficile de dire ce que l'on pourrait faire mal et comment être plus intelligent, car il n'est pas évident ce que vous êtes en train d'essayer de réaliser en faisant cela. Sonne un peu comme votre problème vient d'une mauvaise approche dans votre programme plus large de la conception...
OriginalL'auteur Jagadeesh N M | 2014-07-31
Vous devez vous connecter pour publier un commentaire.
Faisant cela aurait un sens si
A
est une classe de base abstraite, ce qui signifie queA
est uniquement destiné à être utilisé comme une base pour d'autres classes, pas instanciée directement. Si c'était le cas, vous définissez lesmethodB
sur la classe A, mais le laisser lettre morte:Ce n'est pas strictement nécessaire. Si vous ne déclarez pas
methodB
n'importe où dansA
, et d'instancierB
, si vous souhaitez toujours être en mesure d'appelermethodB
du corps demethodA
, mais c'est une mauvaise pratique; il n'est pas clair oùmethodA
est censé venir de l', ou que les enfants des classes de nécessité de le remplacer.Si vous voulez être plus formel, vous pouvez utiliser le Python
abc
module de déclarer qu'une classe de base abstraite.À l'aide de ce sera effectivement vous empêcher de l'instanciation de
A
ou toute classe qui hérite deA
sans écrasermethodB
. Par exemple, si B ressemblait à ceci:Vous obtenez une erreur lors de l'instanciation:
La même arriverait-il si vous avez essayé de l'instanciation
A
.__metaclass__
explicitement, et de ne pas utiliser de l'ABC en tant que classe de base dans la définition?OriginalL'auteur dano
Vous pouvez faire quelque chose comme ceci:
Noter, qu'en fait il n'y a aucun appel d'un parent, il est juste un appel à la fonction
foo
de l'instance de la classe enfant, cette instance a héritéfoo
de parent, c'est impossible:produira:
AttributeError: A instance has no attribute 'testb'
parce que
Ce que j'ai voulu montrer que, vous pouvez créer une instance de la classe enfant, et il aura toutes les méthodes et paramètres à partir de deux parents et de ses propres classes.
OriginalL'auteur Alexey
Vous pouvez utiliser la fonction de tant qu'il était attaché à un objet, qui semble être à partir de votre échantillon. Si vous avez un
B
objet, vous pouvez utiliser sesmethodb()
fonction à partir d'absolument n'importe où.parent.py:
child.py
Vous pouvez voir comment cela fonctionne après l'importation:
Accordée, vous ne serez pas en mesure de créer un nouveau
B
objet à partir de l'intérieur deparent.py
, mais vous serez toujours en mesure d'utiliser ses méthodes, si c'est passé à une fonction dansparent.py
en quelque sorte.OriginalL'auteur TheSoundDefense
Il existe trois approches/moyens de le faire ! mais je vous recommande fortement d'utiliser l'approche #3 composition/découplage a certains avantages en termes de modèle de conception. (GOF)
OriginalL'auteur grepit