methoden generieren

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
mayx
User
Beiträge: 71
Registriert: Sonntag 3. Mai 2009, 02:51

Hey,

wahrscheinlich eine Anfängerfrage, aber ich bekomme es nicht hin ;(

Ich versuche mit einer For-Schleife Methoden zu generieren, die alle einwenig anders sind. Mein Versuch:

Code: Alles auswählen

 for i in range(10):
   methodenname = 'self.pushbutton%dPlayer1' %i
   adresse = '/pushbutton/%d/1 ' %i
   print methodenname +'  '+ adresse
   test.bind(methodenname, adresse)
   def methodenname(self, *msg):  # hier scheint es zu scheitern ;(
       print = msg[0][2]
So soll es dann generiert aussehen:

Code: Alles auswählen

test.bind('self.pushbutton1Player1', "/pushbutton/1/1") 
def touchPadYPlayer1(self, *msg):
        print msg[0][2]

test.bind('self.pushbutton2Player1', "/pushbutton/2/1") 
def touchPadYPlayer2(self, *msg):
        print msg[0][2]

......
Dies Beispiel wurde mir empfohlen, meine Versuche scheitern blöderweise:

Code: Alles auswählen

import functools
# Methode
def on_click(button_id, param):
    print(button_id, param)

# Methode definieren   
f = functools.partial(on_click, 1)
g = functools.partial(on_click, 2)

# Methoden aufrufen
f("spam")
g("eggs")
Vielen Dank für die Hilfe und Lieben Gruß
mayx
BlackJack

@mayx: Wieso scheitert das?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Suchst Du etwas in dieser Art?

Code: Alles auswählen

class A:
    def __init__(self):
        for i in xrange(10):
           methodenname = 'pushbutton%dPlayer1' %i
           adresse = '/pushbutton/%d/1 ' %i
           print methodenname, adresse
           # test.bind(methodenname, adresse) # Was immer das sein mag
           setattr(self, methodenname, self.my_func)

    def my_func(self, msg):
        print msg

a = A()
a.pushbutton1Player1(1)
a.pushbutton9Player1(9)
Oder sogar so etwas?

Code: Alles auswählen

class A:
    def __init__(self):
        for i in xrange(10):
           methodenname = 'pushbutton%dPlayer1' %i
           adresse = '/pushbutton/%d/1 ' %i
           print methodenname, adresse
           # test.bind(methodenname, adresse) # Was immer das sein mag
           setattr(self, methodenname, lambda arg=i: self.my_func(arg))

    def my_func(self, msg):
        print msg

a = A()
a.pushbutton1Player1()
a.pushbutton9Player1()
MfG
HWK
mayx
User
Beiträge: 71
Registriert: Sonntag 3. Mai 2009, 02:51

Hey,

Danke für die Hilfe, aber scheinbar habe ich ein Verständnisproblem.
Ich will statt den weiterholten hinschrieben von

Code: Alles auswählen

test.bind('self.pushbutton1Player1', "/pushbutton/1/1")
def touchPadYPlayer1(self, *msg):
        print msg[0][2]

test.bind('self.pushbutton2Player1', "/pushbutton/2/1")
def touchPadYPlayer2(self, *msg):
        print msg[0][2]
eine Schleife, die mir genau das schreibt.
Geht das nicht?

Das mit 1 und 9 check ich leider genauso wenig wieder der empfohlende Code. Ach man ...

kann doch nicht so schwer sein Methoden zu generien. ;(
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das willst du wirklich nicht machen, partial ist der vernünftige Weg. Gehe doch mal auf BlackJacks Post ein.
Das Leben ist wie ein Tennisball.
mayx
User
Beiträge: 71
Registriert: Sonntag 3. Mai 2009, 02:51

Blackjacks:
Hmm. Warum das scheitert:
weil ich es nicht hin bekomme ;(
ich bekommes es nicht übertragen in die partial form.

Code: Alles auswählen

 for i in range(10):
   methodenname = 'self.pushbutton%dPlayer1' %i
   adresse = '/pushbutton/%d/1 ' %i
   print methodenname +'  '+ adresse
   test.bind(methodenname, adresse)
   def methodenname(self, *msg):  # hier scheint es zu scheitern
       print = msg[0][2]
def methodenname geht nicht!

werd mir dann noch mal in Ruhe partial reinziehen.
Antworten