2016-04-12 3 views
3

私はクラスのメソッドを使用する方法を探していますが、そのクラスでは定義されていませんが動的に処理されます。私は例を取るために、実現したいと思いますどのような、明示的に定義する必要なく、クラス内aaabbb(など)を使用しての可能性にPythonに「ワイルドカードメソッド」はありますか?

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 

から移動することです。上記の例では、使用されるメソッドの名前(例えば、aaa)を受け取り、それに応じてメッセージをフォーマットする構造になります。

「ワイルドカード方式」は、名前を処理し、名前に応じて条件付きの処理を実行する「ワイルドカード方式」です。疑似コードの場合(上の例を複製する場合)

def *wildcard*(self, msg=""): 
    method = __name__which__was__used__to__call__me__ 
    print("{msg} {method}".format(msg=msg, method=method)) 

このような構成は可能ですか?

答えて

10

あなたは__getattr__メソッドクラスをオーバーロードできます。

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") 

結果:

hello aaa 
hello bbb 
0

あなたが事前にメソッドの名前を知っている場合、あなたはすべての追加デコレータでこれを行うことができますがあなたのための方法。

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 

はこのようにそれを使用します。

@glue(f = 'wildcard', names = ['aaa', 'bbb']) 
class Hello(): 
    def wildcard(self, msg='', name=''): 
     print("{} {}".format(msg, name)) 

あなたはデコレータに慣れていない場合は、上記の@構文は、クラス定義の後にこれを行うことに相当します。

Hello = glue(f = 'wildcard', names = ['aaa', 'bbb'])(Hello) 
関連する問題