dynamische methoden erstellen

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
nvidia
User
Beiträge: 31
Registriert: Freitag 11. Februar 2011, 16:46

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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
Das Leben ist wie ein Tennisball.
nvidia
User
Beiträge: 31
Registriert: Freitag 11. Februar 2011, 16:46

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@nvidia: Wie willst du denn die attribute/Methoden in deinem Code aufrufen, wenn du deren Namen erst zur Laufzeit (lies: nach dem Programmieren) kennst?
In specifications, Murphy's Law supersedes Ohm's.
nvidia
User
Beiträge: 31
Registriert: Freitag 11. Februar 2011, 16:46

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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:?
In specifications, Murphy's Law supersedes Ohm's.
nvidia
User
Beiträge: 31
Registriert: Freitag 11. Februar 2011, 16:46

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?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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.
In specifications, Murphy's Law supersedes Ohm's.
Antworten