aufrufen von child-Klassen-Methode aus der übergeordneten Klasse-Datei in 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")
Ist es eh zu rufen methodb()
im parent.py
?
Wenn Sie es brauchen, das ist eine ziemlich erhebliche code smell.
Kann sein, ich mache es falsch, aber auf der Suche nach anderen intelligenter Ansatz.
Es ist schwer zu sagen, was Sie falsch macht und wie man schlauer werden, denn es ist nicht klar, was Sie versuchen zu erreichen, dies zu tun. Ein bisschen klingt dein problem kommt aus einer unglücklichen Ansatz in Ihrem breiteren Programm-design...
Kann sein, ich mache es falsch, aber auf der Suche nach anderen intelligenter Ansatz.
Es ist schwer zu sagen, was Sie falsch macht und wie man schlauer werden, denn es ist nicht klar, was Sie versuchen zu erreichen, dies zu tun. Ein bisschen klingt dein problem kommt aus einer unglücklichen Ansatz in Ihrem breiteren Programm-design...
InformationsquelleAutor Jagadeesh N M | 2014-07-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies würde nur Sinn machen, wenn
A
ist eine abstrakte Basisklasse, was bedeutet, dassA
ist nur dazu genutzt werden, um als Basis für andere Klassen, die nicht direkt instantiiert werden. Wenn das der Fall ist, definieren SiemethodB
auf Klasse Ein, aber lassen Sie es nicht angewendet:Dies ist nicht unbedingt notwendig. Wenn Sie nicht erklären
methodB
überall inA
und instanziierenB
, Sie würden immer noch rufen könnenmethodB
aus dem KörpermethodA
, aber es ist eine schlechte Praxis ist; es ist nicht klar, womethodA
ist kommen soll, oder dass untergeordnete Klassen müssen, um es zu überschreiben.Wenn Sie möchten, um mehr formale, können Sie den Python -
abc
Modul zu deklarieren, als eine abstrakte Basisklasse.Verwenden dies tatsächlich verhindern, dass Sie instanziieren
A
oder jede Klasse, die erbt vonA
ohne überschreibenmethodB
. Zum Beispiel, wenn B sah wie folgt aus:Würden Sie eine Fehlermeldung erhalten, versucht zu instanziieren:
Das gleiche würde passieren, wenn Sie versucht, die Instanziierung
A
.__metaclass__
ausdrücklich, und nicht nur der Einsatz von ABC als Basis-Klasse in der definition?InformationsquelleAutor dano
Können Sie etwas wie das hier tun:
Beachten Sie, dass in der Tat es ist kein Anruf von den Eltern, es gibt nur ein Aufruf der Funktion
foo
von der Instanz der Kind-Klasse, dieser Instanz geerbt hatfoo
von den Eltern, also das ist unmöglich:produzieren:
AttributeError: A instance has no attribute 'testb'
weil
Was ich haben wollte, zu zeigen, dass Sie können erstellen Sie eine Instanz der Kind-Klasse, und es wird über alle Methoden und Parameter, die von beiden Eltern und es ' s eigene Klassen.
InformationsquelleAutor Alexey
Könnten Sie die Funktion überall so lange, wie es angebracht wurde, um ein Objekt, was es zu sein scheint, aus Ihrer Probe. Wenn Sie eine
B
Objekt, dann können Sie Ihremethodb()
Funktion von absolut überall.parent.py:
child.py
Können Sie sehen, wie dies funktioniert nach dem importieren:
Gewährt, Sie werden nicht in der Lage, erstellen Sie eine neue
B
Objekt von innenparent.py
, aber Sie werden immer noch in der Lage sein, seine Methoden, wenn es übergeben, um eine Funktion inparent.py
irgendwie.InformationsquelleAutor TheSoundDefense
Gibt es drei Ansätze/Möglichkeiten, dies zu tun ! aber ich empfehle, verwenden Sie die Methode #3, weil die Zusammensetzung/Entkopplung hat bestimmte Vorteile in Bezug auf design-Muster. (GOF)
InformationsquelleAutor grepit