aga*_*ett 2 python attributes function
我知道函数可以有属性.所以我可以做到以下几点:
def myfunc():
myfunc.attribute += 1
print(myfunc.attribute)
myfunc.attribute = 1
Run Code Online (Sandbox Code Playgroud)
是否可以通过任何方式使这样的函数表现得好像它是一个实例?例如,我希望能够做到这样的事情:
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)
Run Code Online (Sandbox Code Playgroud)
就目前而言,该函数只有一个"实例",因此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))
Run Code Online (Sandbox Code Playgroud)
但这不起作用.也许我做错了,但它说test没有attribute.(我假设它是因为wrapper实际上有属性.)
我需要这个的原因是因为我有一个库需要一个具有特定签名的函数.可以将这些函数放入各种管道中,以便按顺序调用它们.我想传递它的相同功能的多个版本,但是根据属性的值改变它们的行为.所以我希望能够添加x和y管道,而不是必须实现一个test1函数和一个test2函数,它们几乎完全相同(除了属性的值).
你可以使用一种__call__可以实现类似功能的方法创建一个类.
为清晰起见编辑:不要创建myfunc函数,而是将其设置为可调用类.它像一个函数一样行走,它像一个函数一样嘎嘎叫,但它可以像一个类一样有成员.
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |