Seite 1 von 1

dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 15:28
von nvidia

Code: Alles auswählen

class abc(object):
    def __init__(self, io):
          self.my_tuple = io
          for x in self.my_tuple:
             ...  

def sample(self):
    if blabla:
        return self.my_tuple[sample]
Hallo,
ich möchte das zur Laufzeit in der Schleife für jedes x die methode sample zur instanz der klasse abc hinzugefügt wird und zwar dynamisch, sodass in der sample-methode alle sample durch das aktuelle x ersetzt werden(also sowohl der methodenname als auch der key für das dict.
ich komm aber da nicht so ganz klar.
also methode setzt man über .setattr, aber wie macht man die function dynamisch?
vielen dank nvidia

Re: dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 15:31
von EyDu
Hallo.

Das hört sich erstmal nicht nach einder sonderlich geschickten Idee an, auch wenn die Umsetzung möglich ist. Welches Problem willst du denn eigentlich lösen, vielleicht lässt sich eine bessere Lösung finden.

Sebastian

Re: dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 15:39
von nvidia
ich will eine klasse erstellen die ihre attribute so zurückgibt:
abc.attribut()
Leider werden die attribute dynamisch geladen und die menge variert von instanz zu instanz

Re: dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 15:54
von pillmuncher
@nvidia: Wie willst du denn die attribute/Methoden in deinem Code aufrufen, wenn du deren Namen erst zur Laufzeit (lies: nach dem Programmieren) kennst?

Re: dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 15:56
von nvidia
der code wird allgemein geschrieben. der benutzer muss selbst entscheiden, welche für ihn interessant sind. Wenn später neue Attribute hinzukommen, dann muss nichts geändert werden, weil der Benutzer seine neuen Attribute sofort abrufen kann.

Re: dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 16:11
von pillmuncher
@nvidia: meinst du sowas:

Code: Alles auswählen

class MyClass(object):
    def __init__(self, stuff):
        for key, value in stuff.items():
            def sample(value=value):
                print value
            setattr(self, 'sample_' + key, sample)

mc = MyClass({'a':1, 'b':2})

mc.sample_a()
mc.sample_b()
Ergebnis:?

Re: dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 16:36
von nvidia
ok danke, das ist es.
Kann man auch in der klasse definieren, dass wenn die function nicht existiert automatisch None zurück gegeben wird?
mt get_attr kann man das individuell machen, aber kann man das auch irgentwie allgemein einstellen?

Re: dynamische methoden erstellen

Verfasst: Mittwoch 6. Juli 2011, 17:01
von pillmuncher

Code: Alles auswählen

def noop(*args, **kwargs):
    pass

class MyClass(object):
    def __init__(self, stuff):
        for key, value in stuff.items():
            def sample(value=value):
                return value
            setattr(self, 'sample_' + key, sample)
    def __getattr__(self, name):
        if name.startswith('sample_'):
            return noop

mc = MyClass({'a':1, 'b':2})

print mc.sample_a()
print mc.sample_b()
print mc.sample_c()
Ergebnis:

Code: Alles auswählen

1
2
None
Mehr dazu hier.