2016-04-12 18 views
3

Bu sınıfta tanımlı olmayan, ancak dinamik olarak işlenen bir sınıf yöntemini kullanmanın bir yolunu arıyorum. Bir örnek almaya, elde etmek istiyorum Ne, bunları açıkça tanımlamak gerek kalmadan sınıf içinde aaa ve bbb (ve diğerleri) kullanılarak olasılığınaPython'da "joker yöntem" var mı?

class Hello: 
    def aaa(self, msg=""): 
     print("{msg} aaa".format(msg=msg)) 

    def bbb(self, msg=""): 
     print("{msg} bbb".format(msg=msg)) 

if __name__ == "__main__": 
    h = Hello() 
    h.aaa("hello") 
    h.bbb("hello") 

# hello aaa 
# hello bbb 

hareket etmektir. Yukarıdaki örnekte, kullanılan yöntemin adını (örneğin, aaa) alan ve buna göre bir mesajı biçimlendiren bir yapı olacaktır. Diğer bir deyişle, isminin yerine geçecek ve isme bağlı olarak koşullu eylemler gerçekleştirebilecek bir "joker yöntem". Sözdizim kodunda (yukarıdaki örneği çoğaltmak için)

def *wildcard*(self, msg=""): 
    method = __name__which__was__used__to__call__me__ 
    print("{msg} {method}".format(msg=msg, method=method)) 
Böyle bir yapı mümkün mü?

cevap

10

Sen __getattr__ yöntem sınıfını aşılmasına neden olabilir:

class Hello: 
    def __getattr__(self, name): 
     def f(msg=""): 
      print("{} {}".format(msg, name)) 
     return f 

if __name__ == "__main__": 
    h = Hello() 
    h.aaa("hello") 
    h.bbb("hello") 

Sonuç: Önceden yöntemlerin adlarını biliyorsanız

hello aaa 
hello bbb 
0

, bir dekoratör ile bu yapabileceğini bütün ekler sizin için yöntemler.

from functools import partial 

def glue(f, names=[]): 
    def wrapper(cls): 
     method = getattr(cls,f) 
     for name in names: 
      setattr(cls, name, partial(method,name=name)) 
     return cls 
    return wrapper 

böyle kullanın:

Hello = glue(f = 'wildcard', names = ['aaa', 'bbb'])(Hello) 
:

Eğer dekoratörler haberiniz yoksa
@glue(f = 'wildcard', names = ['aaa', 'bbb']) 
class Hello(): 
    def wildcard(self, msg='', name=''): 
     print("{} {}".format(msg, name)) 

, @ sözdizimi yukarıdaki sınıf tanımının sonra bunu eşdeğerdir

İlgili konular