2017-09-28 2 views
0

Ich schreibe ein Python (Python 2.7) Programm. Ich möchte eine Klasse erstellen, die von einer Klasse erbt, die dynamisch von einer anderen Klasse erbt. kann so etwas getan werden?Python: Wie man von einer dynamisch geerbten Klasse erbt?

zum Beispiel:

class A(Object): 
    def print_me(): 
     print "A" 

class B(Object): 
    def print_me(): 
     print "B" 

class son(<inherits from A or B dynamically, depending on the input>): 
    pass 

class grand_son(son): 
    pass 

, was ich will, ist, dass in dem folgenden Code:

grand_son("A").print_me() 

gedruckt wird:

>> A 

und der folgende Code:

grand_son("B").print_me() 
drucken

wird:

>> B 

es kann getan werden?

Danke.

+3

Was ist der eigentliche Anwendungsfall hier? –

+0

Ich habe eine Klasse, die mehrere abstrakte Methoden definiert. Diese Methoden werden je nach der Plattform, auf der sie ausgeführt werden, unterschiedlich implementiert. also habe ich mehrere Klassen, die von dieser Klasse erben und diese Funktionen implementieren. dann habe ich eine andere Klasse, die mehr Methoden implementiert und ich möchte es von der richtigen Plattform-Klasse erben und diese Klasse kann auch von geerbt werden. kann dieser Fall implementiert werden? – user1845156

Antwort

2

Sie können das Formular mit drei Argumenten type() verwenden, um dynamisch eine Klasse zu erstellen. Hier

ist eine interaktive Demonstration:

>>> class A(object): 
... def print_me(self): 
...  print "A" 
... 
>>> class B(object): 
... def print_me(self): 
...  print "B" 
... 
>>> def getclass(name): 
... return {"A":A, "B":B}[name] 
... 
>>> def getson(parent): 
... return type("son", (getclass(parent),), {}) 
... 
>>> son = getson("A") 
>>> son().print_me() 
A 
>>> son = getson("B") 
>>> son().print_me() 
B 

Mit diesem können Sie eine grand_son Funktion definieren, wie so:

>>> def grand_son(grandparent): 
... return type("grand_son", (getson(grandparent),), {}) 
... 
>>> grand_son("A")().print_me() 
A 
>>> grand_son("B")().print_me() 
B 
>>> 
+0

ich bin mir dieser lösung bewusst, aber es funktioniert nicht für mich, was ich will ist grand_son vom sohn zu erben, wie kann ich das mit dieser lösung machen? – user1845156

+0

Siehe zusätzliches Beispiel einschließlich grand_son – jq170727

+0

mit dieser Lösung, jede Unterklasse muss mit einer Funktion erstellt werden, ich möchte die normale verwenden: Klasse () für grand_son und für den Rest der Klassen, die von grand_son erben können. – user1845156

Verwandte Themen