1 回答

TA貢獻1871條經驗 獲得超13個贊
函數和方法的處理方式略有不同,而不是一視同仁:
功能:
[A]
正常添加函數到列表
方法:
self
調用裝飾器時的未綁定方法,因此還沒有關聯的實例或值[B]
_tagged
我們通過設置其屬性在方法未綁定時(在創建實例之前)“標記”該方法[C]
一旦創建了一個實例(并且self
變量已經被填充),__init__()
我們在里面搜索并添加所有標記的方法我們可以在之后添加方法,因為一旦它們被綁定到一個實例,參數
self
就會被填充(這意味著它在技術上沒有參數,類似于functools.partial()
)
import inspect
class Runner:
def __init__(self):
self.functions = []
def add(self, function):
if len(inspect.signature(function).parameters) == 0:
# [A] adds if has no parameters
self.functions.append(function)
else:
# [B] tags if has 1 parameter (unbound methods have "self" arg)
function._tagged = True
return function
# [C] search through object and add all tagged methods
def add_all_tagged_methods(self, object):
for method_name in dir(object):
method = getattr(object, method_name)
if hasattr(method, '_tagged'):
self.functions.append(method)
def run(self):
for function in self.functions:
function()
runner = Runner()
然后使用與下面相同的初始代碼
@runner.add
def myFunction():
print('myFunction')
class MyClass:
def __init__(self):
runner.add_all_tagged_methods(self)
@runner.add
def myMethod(self):
print('myMethod')
myObject = MyClass()
myObjectMethod = myObject.myMethod
runner.run()
添加回答
舉報