Seite 1 von 1

Klasseninstanz dynamisch erzeugen

Verfasst: Donnerstag 16. Februar 2012, 13:36
von ritzen
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ß

Re: Klasseninstanz dynamisch erzeugen

Verfasst: Donnerstag 16. Februar 2012, 13:41
von Dav1d
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)

Re: Klasseninstanz dynamisch erzeugen

Verfasst: Donnerstag 16. Februar 2012, 13:50
von 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.

Re: Klasseninstanz dynamisch erzeugen

Verfasst: Donnerstag 16. Februar 2012, 13:58
von ritzen
Vielen Dank. Das hat mir weitergeholfen.
Gruß