2013-07-18 2 views
7

yöntem isimlerinin dizeleri kullanılarak Bir kullanıcı seçimine dayalı bu yöntemler. Yöntemler endekse göre çağrılmalıdır. Bir kullanıcı '0'ı seçerse, methA çağrılır,' 5 'ise methF çağrılır. Ben başarmışDinamik Yöntem Çağrı Python 2.7 ben böyle bir sınıfın yöntemlerini aşağı listeleyen bir demet var

def makeSelection(self, selected): 
    #methodname = t[selected] 
    #but as this is from within the class , it has to be appended with 'self.'methodname 
    # also need to pass some arguments locally calculated here 

eval ile bir şeyler atlatmanın ancak hata verir ve hiç şık değil şu şekildedir: Bunu yapmak için

Benim yöntemidir. Eğer (ithal modülleri dahil) bir nesne üzerinde bir yöntem arıyorsan

cevap

19

kullanabilirsiniz:

getattr(obj, t[i])(*args) 

geçerli modül

getattr(sys.modules[__name__], t[i])(*args) 

args bir işlevi çağırmak gerekiyorsa bir liste veya gönderilecek argümanların bir listesidir, yoksa bunları başka bir işlevle yaptığınız gibi listeleyebilirsiniz. Eğer aynı nesne üzerinde başka bir yöntemi çağırmak için çalışan bir yöntemde olduğundan, obj

getattr yerine self ilk birini kullanmak bir nesne ve bir dize alır ve niteliğini dönen nesne içindeki bir özellik arama yapar eğer varsa. obj.x ve getattr(obj, 'x') aynı sonucu elde eder. Bu tür yansımalara daha fazla bakmak istiyorsanız, setattr, hasattr ve delattr işlevleri de vardır.



Tamamen alternatif bir yaklaşım:
Bu cevap aldı ilgi miktarının fark ettikten sonra, ben ne yaptığını için farklı bir yaklaşım önermek için gidiyorum. Bazı yöntemler kendilerini bu Verilen

id_to_method = { 
    0: methA, 
    1: methB, 
    2: methC, 
} 

yöntemlere ben bir sözlük haritalama numaralarını inşa her yöntemin bir sayı (seçime) karşılık gelmesini sağlamak için

def methA(*args): print 'hello from methA' 
def methB(*args): print 'bonjour de methB' 
def methC(*args): print 'hola de methC' 

mevcut varsayıyoruz, id_to_method[0]() methA çağırmak olacaktır. İki bölümden oluşuyor, ilk önce id_to_method[0], fonksiyon nesnesini sözlükten alıyor, daha sonra () onu çağırıyor. Ben de size yukarıda muhtemelen örnek yöntemleri dikkate olsaydı güzel çözüm ne olurdu

choice = int(raw_input('Please make a selection')) 
id_to_method[choice](arg1, arg2, arg3) # or maybe no arguments, whatever you want 
+0

gibi bir şey olurdu verilen, gerçek kodunda argüman id_to_method[0]("whatever", "args", "I", "want) geçebileceği? Yani: yazdığınız yöntemlerin artık kendi kendini argümanını içerdiğini düşünün: def methA (self, * args): print 'merhaba methA'dan' fakat ben sözlükleri sınıfta oluşturmak istiyorum (böylece anahtarlar zorunlu olarak okunabilir) bir örneğe sahip olmak ve kurucuda değil. Bunu nasıl yaptı? – marcotama

+0

Bağlanmamış yöntemleri ve "getattr" işlevlerini burada olduğu gibi kullanabilirsiniz. Ne istediğini anladığımdan emin değilim. –

+0

Sınıfımın X nesnelerine alternatif "keşif" yöntemleri var. Fonksiyon y kullanıcı ile arayüz oluşturur ve istenen arama yöntemini çağırır. If-elif-elif'e sahip olmaktan ziyade ... daha iyi göründüğü için bir sözlüğe erişmeyi tercih ederim. Ayrıca, sözlük bir sınıf değişkeni olsaydı, anahtarlarına dışarıdan erişebiliyordum. Buradaki sorun, bu keşif yöntemlerinin örnek değişkenlere bağlı olmasıdır. Ben de "getattr" hilesi düşündüm (ve uyguladık), ama sadece hiç hoş görünmüyor. – marcotama