2017-01-15 11 views
-3
私は、次のやりたい

にクラスのインスタンスを渡す:私はクラスを持っている
、そのクラスはCMDSという名前の辞書を持っています。デコレータを介して要素を動的に追加したいデコレータは、このクラスのメソッドでなければなりません。私が欲しいもので
コード例:仕事にそのためにPythonはそのメソッド(関数)デコレータ

class Foo(object): 
    #In a class: 
    @cmd("exit") 
    def cmd_exit(self, *args): 
     self.run=0 
     print("Exiting mainloop...") 
    @cmd('reconnect') 
    def cmd_reconnect(self): 
     self.connect(self._host) 

私はデコレータある方法cmdに自己を渡す必要があります。ただし、cmdselfを受け取りません。
どうすればいいですか?
EDIT:
マイFoo.cmd方法は、次のような定義があります

def cmd(self, name): 
    def decorator(funcs): 
     fname=name if name else funcs.__name__ 
      self.cmds[fname]=funcs 
      self.cmdLogger.info("Registrated function %s", name) 
      return 
    return decorator 

をし、それが唯一の内側のデコレータことを私はデコレータに渡す文字列(例えば「出口」と「再接続」) 注意を受けます(デコレータ)はNoneを返します。したがって、デコレータが呼び出された元の関数は「削除」されています。

+1

あなたの最初のコードブロックがあることを意図していると仮定すると、 'class Foo:'ブロックの中にネストされています(それを加えてください!): 'self'はまだ存在していないだけでなく、クラス自体もまだ存在しません。 'class'ブロックの最上位レベルでは、あなたはそのクラスが何を含むべきかを定義しています。もちろん、そのクラスのインスタンスを持つことはできません。 – Kevin

+0

@Kevin ... oh @Đ#đ、それが問題でした。メソッドが定義されているときに、そのメソッドに対してメソッドを呼び出すことはできません。しかし、私は後でクラスの外で 'cmd_'関数を動かし、' Foo.cmd(name) 'を呼び出すことでそれを行うことができます。私はそれを見逃して本当に疲れているはずです。私はそれを受け入れることができるように答えを書くべきです。 – Sasszem

答えて

1

あなたは「中央場所」であなたのログを追跡するために、別のクラスから「CMDS」を継承することができます:

from functools import wraps 

def cmd(*name): 
    def wrapper(fn): 
     @wraps(fn) 
     def real_decorator(*args, **kw): 
      fname = name[0] if name else fn.__name__ 

      cls = args[0] 
      cls.cmds[fname]=fn 
      #self.cmdLogger.info("Registrated function %s", name) 
      return fn(*args,**kw) 
     return real_decorator 
    return wrapper 

class Logger(object): 
    def __init__(self): 
     self.cmds = {} 
     #self.cmdLogger = ... 

class Foo(Logger): 
    @cmd("exit") 
    def cmd_exit(self, *args): 
     self.run=0 
     print("Exiting mainloop...") 

    @cmd('reconnect') 
    def cmd_reconnect(self): 
     self.connect(self._host) 

f = Foo() 
f.cmd_exit() 
print(f.cmds) 

戻り値:

Exiting mainloop... 
{'exit': <function Foo.cmd_exit at 0x7fb11cfee048>} 
関連する問題