Seite 1 von 1

methoden generieren

Verfasst: Samstag 11. Juli 2009, 16:07
von mayx
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

Verfasst: Samstag 11. Juli 2009, 16:31
von BlackJack
@mayx: Wieso scheitert das?

Verfasst: Samstag 11. Juli 2009, 17:41
von HWK
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

Verfasst: Sonntag 12. Juli 2009, 18:45
von mayx
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. ;(

Verfasst: Sonntag 12. Juli 2009, 19:00
von EyDu
Das willst du wirklich nicht machen, partial ist der vernünftige Weg. Gehe doch mal auf BlackJacks Post ein.

Verfasst: Sonntag 12. Juli 2009, 19:10
von mayx
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.