2016-10-07 4 views
2

Edit: Entschuldigung für die Verwirrung über Eltern/Kind. Ich bin neu in OOP und verwirre meine Begriffe.Referenzieren von Klassenmitgliedern aus Kindklasse

Ich möchte die geeignete Strategie zum Verweis auf Klassenattribute verstehen, die von einer geerbten (Kindklasse) zur Verfügung gestellt werden.

Ich habe einen Fall, in dem ich eine gemeinsame Basisklasse habe, die verwendet wird, und mehrere Elternklassen, von denen die Kindklasse erben kann. Jede untergeordnete Klasse verfügt über dieselben Methoden, aber unterschiedliche Implementierungen. Das Problem, das ich habe, ist, dass ich die Kindklasse brauche, um auf Klassenattribute des Elternteils zu verweisen. Der folgende Code scheint gut zu funktionieren, aber meine IDE (pycharm) beschwert sich über eine nicht aufgelöste Attributreferenz, also frage ich mich, ob dies ein Anti-Pattern ist.

Modul parent1.py:

class Parent(object): 
    def __init__(self): 
     pass 
    def do_something(self): 
     result = self.instance_id 

Modul parent2.py:

class Parent(object): 
    def __init__(self): 
     pass 
    def do_something(self): 
     result = self.instance_id+1 

Modul child.py:

if CONSTANT: 
    from parent1 import Parent 
else: 
    from parent2 import Parent 

class Child(Parent): 
    def __init__(self, instance_id): 
     self.instance_id = instance_id 
     Parent.__init__(self) 

In In diesem Fall markiert die pycharm-IDE den Verweis auf self.instance_id in Parent1 und Parent2 als 'Unresolved attribute reference', obwohl der Code funktioniert. Ich habe darüber nachgedacht, dies in jede Elternklasse zu verschieben, aber in Bezug auf instance_id muss sich nichts in der Elternklasse ändern, so dass es überflüssig erscheint, es einmal für jedes Elternteil zu definieren. Also meine Frage ist wie folgt: 1. Ist etwas falsch mit dieser Code-Organisation? 2. Wenn nichts falsch daran ist, wie kann ich die IDE reparieren, um diese Referenz zu lösen?

+1

Ich habe noch nie von einem Elternteil gehört, der von einem Kind erbt. –

+2

Sie sollten weniger verwirrende Namen für die Struktur auswählen, die Sie darstellen möchten. Kindklassen erben von Eltern. – Ryan

+0

Was ist der Zweck von '' Child2''? Es wird nirgendwo in deinem Code referenziert. – Schmuddi

Antwort

1

Verwenden Sie eine BaseParent Klasse, die instance_id definiert, und beide Parent Implementierungen erben von ihm. Das wird deine IDE zum Schweigen bringen. Als Nebeneffekt kann Child entweder Parent erweitern, wird aber immer eine Instanz von BaseParent sein.

Das beiseite, das ist nicht sehr koscher objektorientierten Design. Das Ändern der Klassenhierarchie während der Programmausführung fällt unter metaprogramming, ein sehr leistungsfähiges Werkzeug, das selten verwendet werden sollte.

Metaprogrammierung, wie Mehrfachvererbung, ist manchmal die perfekte Lösung für ein Problem - aber es hat seinen Preis. Beide stellen eine Ebene von Komplexität dar, die schwer zu verstehen ist, leicht zu übersehen ist, wenn man die Codebasis durchläuft und danach schwierig zu warten ist.

Dies gilt insbesondere, wenn der Leser nicht der Implementierer ist, oder sogar für die gleiche Person nach einiger Zeit. Ich würde die Entscheidung revidieren, in den meisten Fällen ist diese Art von Ansatz nicht notwendig.

+0

Vielen Dank für das Feedback, das war wirklich hilfreich. Das Problem, das ich zu lösen versuche, ist, dass ich Code der oberen Schicht in der Lage sein soll, den gleichen Klassennamen zu referenzieren (in diesem Beispiel untergeordnet), während ich einige der zugrunde liegenden Implementierungen verändere. Der spezielle Anwendungsfall ist, dass dieser Code eine Schnittstelle zu Hardware bereitstellt, aber wir wollen in der Lage sein, eine Softwaresimulation der Hardware anzuschließen. So können Oberschicht-Skripte geschrieben werden, ohne sich darum kümmern zu müssen, ob sie mit realer Hardware oder der Softwaresim sprechen. –

Verwandte Themen