Klasseninstanz dynamisch erzeugen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ritzen
User
Beiträge: 5
Registriert: Donnerstag 16. Februar 2012, 12:21

Hallo,

in der Doku und im Netz habe ich nicht entsprechendes gefunden:
Ich möchte eine Klasseninstanz abhängig vom übergebenden Datentyp dynamisch erzeugen. In etwa so:

Code: Alles auswählen

class BaseClass:
	def __init__(self,test):
		if isinstance(test,float):
			return DerivedClass1(test)
		elif isinstance(test,complex):
			return DerivedClass2(test)
			
class DerivedClass1(BaseClass):
	def __init__(self,test):
		print "Ich bin Derived 1"
	
class DerivedClass2(BaseClass):
	def __init__(self,test):
		print "Ich bin Derived 2"

#main
x = BaseClass(2.)
y = BaseClass(2+1j)
Der Code ist natürlich falsch. __init__ erlaubt kein "return". Wie geht es richtig?

Gruß
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du könntest dazu eine Metaklasse nutzen oder, du packst deinen __init__-Code aus der BaseClass in eine Funktion:

Code: Alles auswählen

class BaseClass:
    def __init__(self,test):
        pass
                        
class DerivedClass1(BaseClass):
    def __init__(self,test):
        print "Ich bin Derived 1"
        
class DerivedClass2(BaseClass):
    def __init__(self,test):
        print "Ich bin Derived 2"

def chose_class(test):
    if isinstance(test,float):
        return DerivedClass1(test)
    elif isinstance(test,complex):
         return DerivedClass2(test)
the more they change the more they stay the same
deets

Alternativ danach gibt es die __new__-methode.

Code: Alles auswählen


class Base(object):

   def __new__(cls, arg):
        if arg == 1:
           return object.__new__(A)
       else:
           return object.__new__(B)


    def __init__(self, arg):
         self.arg = arg

class A(Base): pass
class B(Base): pass
Das ist aber ungetestet.
ritzen
User
Beiträge: 5
Registriert: Donnerstag 16. Februar 2012, 12:21

Vielen Dank. Das hat mir weitergeholfen.
Gruß
Antworten