2010-02-26 8 views
5

herkes. Lütfen aşağıdaki örneğe bakınız. Bot sınıfı yöntemin çağrılması gerektiğini belirten 'schedule_action' yöntemine bir dize sağlamak istiyorum. Aşağıdaki örnekte bunu 'bot.action()' olarak gösterdim, ancak doğru şekilde nasıl yapılacağını bilmiyorum.Python komut dosyası çalışıyor. String olarak bir metod ismim var. Bu yöntemi nasıl ararım?

getattr(bot, action)() 

getattr adıyla nesne üzerinde bir öznitelik bakacaktır Kısacası

class Bot: 
    def work(self): pass 
    def fight(self): pass 

class Scheduler: 
    def schedule_action(self,action): 
     bot = Bot() 
     bot.action() 

scheduler = Scheduler() 
scheduler.schedule_action('fight') 

cevap

13

Kullanım getattr:

Ayrıca, getattr'ın, istenen eylemin mevcut olmaması durumunda varsayılan değeri döndürmenizi sağlayan isteğe bağlı bir argüman aldığını unutmayın. o senin durumundaki geçerliyse

7

Lütfen yardım - özellikler veri veya sonunda fazladan () üye yöntemleri yöntemini çağırır olabilir.

Siz de bu gibi ayrı bir adımda yöntem alabilir

:

method_to_call = getattr(bot, action) 
method_to_call() 

Ve her zamanki gibi yönteme argüman iletebilirsiniz:

getattr(bot, action)(argument1, argument2) 

veya

method_to_call = getattr(bot, action) 
method_to_call(argument1, argument2) 
3
class Scheduler: 
    def schedule_action(self,action): 
     bot = Bot() 
     boundmethod = getattr(bot, action) 
     boundmethod() 
1
def schedule_action(self,action): 
     bot = Bot() 
     bot.__getattribute__(action)() 
6

emin değilim ama dizeleri bir işlev işaretçisi kullanılarak yerine manipüle düşünebilir.

class Bot: 
    def work(self): 
     print 'working' 
    def fight(self): 
     print 'fightin' 

class Scheduler: 
    def schedule_action(self,action): 
     bot = Bot() 
     action(bot) 

scheduler = Scheduler() 
scheduler.schedule_action(Bot.fight) 
scheduler.schedule_action(Bot.work) 

yazdırır Hangi: Eğer bunu yapabiliyorsa

fightin 
working 

, bu derleme zamanında bir yanlış yazılmış fonksiyonu hakkında bir hata verecektir kod çalıştırma zamanında yerine yorumlanır zaman . Bu, özellikle eylemler bir zaman dilimi içinde yapıldıysa, aptal veri girişi hataları için hata ayıklama döngüsünü kısaltabilir. Hiçbir şey bir şeyleri bir gecede koşturmaktan ve sabah bir sözdizimi hatası aldığınızı keşfetmekten daha fazla şey yapmaz.

+0

Bu seçeneği kesinlikle göz önünde bulundurun. Dinamik olarak aramak için bir yöntem seçmek istiyorsanız, bu sizin için doğru seçenek olabilir. Eğer ismi “kıvrımlı” bir şekilde oluşturuyorsanız, sadece “getattr” tabanlı seçenekleri kullanın (bir dosyadan, bir soketten veya kullanıcı girişinden okumak gibi). – Wesley

+1

Açıkladığınız durumda daha önce bir hata verecektir, ancak hata derleme zamanında değil. –

+0

ah, haklısın. yayın düzenlendi. –

1

Ayrıca, yöntemleri eylemlere eşlemek için bir sözlük kullanabilirsiniz. Örneğin:

ACTIONS = {"fight": Bot.fight, 
      "walk": Bot.walk,} 

class Scheduler: 
    def schedule_action(self, action): 
     return ACTIONS[action](Bot()) 
İlgili konular