我知道函数可以有属性。所以我可以做到以下几点:是否有可能使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