我知道函數可以有屬性。所以我可以做到以下幾點:是否有可能使Python函數的行爲像實例一樣?
def myfunc():
myfunc.attribute += 1
print(myfunc.attribute)
myfunc.attribute = 1
是否有可能通過任何方式使這樣一個函數的行爲,如果它是一個實例?例如,我希望能夠做這樣的事情:
x = clever_wrapper(myfunc)
y = clever_wrapper(myfunc)
x.attribute = 5
y.attribute = 9
x() # I want this to print 6 (from the 5 plus increment)
y() # I want this to print 10 (from the 9 plus increment)
既然這樣,有功能的只有一個「實例」,所以attribute
只存在一次。通過x
或y
修改它會更改相同的值。我希望他們每個人都有自己的attribute
。這有可能做到嗎?如果是這樣,你能提供一個簡單的功能性例子嗎?
重要的是,我可以從函數內部訪問attribute
,但取值爲attribute
的值根據函數的哪個「實例」被調用而不同。本質上,我想使用attribute
就好像它是函數的另一個參數(以便它可以改變函數的行爲),但不會將其傳入。(假設函數的簽名是固定的,所以我不能更改參數列表。)但我需要能夠設置attribute
的不同值,然後按順序調用函數。我希望這是有道理的。
主要答案似乎在說做這樣的事情:
class wrapper(object):
def __init__(self, target):
self.target = target
def __call__(self, *args, **kwargs):
return self.target(*args, **kwargs)
def test(a):
return a + test.attribute
x = wrapper(test)
y = wrapper(test)
x.attribute = 2
y.attribute = 3
print(x.attribute)
print(y.attribute)
print(x(3))
print(y(7))
但是,這並不工作。也許我做錯了,但它說test
沒有attribute
。 (我假設這是因爲wrapper
實際上具有該屬性。)
我需要這個的原因是因爲我有一個庫,期望具有特定簽名的函數。可以將這些函數放入各種管道中,以便它們按順序調用。我想通過它的同一個函數的多個版本,但基於屬性的值來改變它們的行爲。所以我希望能夠將x
和y
添加到流水線中,而不是必須實現test1
函數和test2
函數,它們的功能幾乎完全相同(除了屬性的值)。
是否有任何特定的原因,你想要一個功能,而不是一個類?這僅僅是爲了教育目的,還是有一個真正的問題,你正試圖解決? – 2010-08-11 15:17:30
類名應該是PascalCase :) – 2010-08-11 15:41:58
試試我的答案。我測試了它,它工作 – 2010-08-11 15:43:14