Метод не намного больше, чем член класса, который оказывается функцией.Суть в том, что когда он вызывается для объекта (a.func(x...)
), объект автоматически добавляется в список аргументов, в результате чего фактический вызов A.func(a, x...)
.
может быть получен следующим образом:
class MyApp(object):
# prepend with _ to "hide" the symbol
def _combine_funcs(*funcs):
def combined_func(*args, **kwargs):
for f in funcs:
f(*args, **kwargs)
return combined_func
def my_first_func(self):
print("First")
def my_second_func(self):
print("Second")
# actually declares combined as a method of MyClass
combined = _combine_funcs(my_first_func, my_second_func)
Использование:
>>> a = MyApp()
>>> a.combined()
First
Second
Но гораздо более понятным способом было бы использовать декоратор для этого в Python 3:
import inspect
def combine_funcs(*funcs):
def outer(f):
def combined_func(*args, **kwargs): # combine a bunch of functions
for f in funcs:
x = f(*args, *kwargs)
return x # returns return value of last one
combined_func.__doc__ = f.__doc__ # copy docstring and signature
combined_func.__signature__ = inspect.signature(f)
return combined_func
return outer
class MyApp(object):
def my_first_func(self):
print("First")
def my_second_func(self):
print("Second")
@combine_funcs(my_first_func, my_second_func)
def combined(self):
"""Combined function"""
pass
decorator заменит тело, но сохранит строку документации и подпись исходной функции (в Python 3).Затем вы можете использовать его как обычно:
>>> a = MyApp()
>>> a.combined()
First
Second
>>> help(a.combined)
Help on method combined_func in module __main__:
combined_func() method of __main__.MyApp instance
Combined function
>>> help(MyApp.combined)
Help on function combined_func in module __main__:
combined_func(self)
Combined function