classmethod
インスタンスメソッドとの違いstaticmethod
最初の注意: 静的メソッドとクラス メソッドはどちらも関数であるため、標準の関数規則がほとんど適用されます。あなたの質問は、静的メソッド(追加の引数が渡されていない)とクラスメソッド(最初の引数でクラスを受け取る)の違いに関するものだと理解しています。
class Test(object):
def standard_method(*args, **kwargs):
# it is instance method (first argument will be instance)
return args, kwargs
@classmethod
def class_method(*args, **kwargs):
# it is class method (first argument will be class)
return args, kwargs
@staticmethod
def static_method(*args, **kwargs):
# it is static method (receives only arguments passed explicitly)
return args, kwargs
証明(または自明の例)は次のとおりです。
>>> t = Test()
>>> t.standard_method()
((<__main__.Test object at 0x0000000002B47CC0>,), {})
>>> t.class_method()
((<class '__main__.Test'>,), {})
>>> t.static_method()
((), {})
ご覧のとおり、渡される引数のリストは、選択したメソッドのタイプによって異なります。あなたが直面している問題は、可変数の引数です。
解決
そのための解決策があります-引数のアンパックを使用します:
def some_decorator(func):
def wrapper(*args, **kwargs):
# do something here
# args is a tuple with positional args, kwargs is dict with keyword args
return func(*args, **kwargs)
return wrapper
その後、によって返される関数は、some_decorator
装飾された関数と同じ量の引数を受け入れます。
したがって、これらの例は両方とも機能します。
@some_decorator
def say_hello():
print 'hello'
@some_decorator
def say_something(something):
print something
付録
完全な例を示すために、そのような構造を使用するとよいでしょう ( の使用法に注意してくださいfunctools.wraps
)。
from functools import wraps
def some_decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# do something here
# args is a tuple with positional args, kwargs is dict with keyword args
return func(*args, **kwargs)
return wrapper
その理由は のドキュメントにfunctools.wraps()
記載されています: 関数名と docstring を保持するため、実質的にラップされた関数のように見えるラッパーになります (これは便利な場合もあります)。