问题描述
我想动态设置类属性。我是这样做的:
class Foo:
def __init__(self):
self.a = 1
for v in [1,2,3]:
setattr(Foo,f"test_{v}",property(lambda self: self.a + v))
foo = Foo()
print(foo.test_1)
print(foo.test_2)
print(foo.test_3)
但我发现这将返回相同的结果。
解决方法
setattr
的签名是 setattr(object,name,value)
class Foo:
pass
for v in [1,2,3]:
setattr(Foo,f"test_{v}",v)
foo = Foo()
print(foo.test_1)
print(foo.test_2)
print(foo.test_3)
输出:
1
2
3
编辑:1
如果将属性设置为对象,则变得非常容易
class Foo:
def __init__(self,a=1):
self.a = a
for v in [1,3]:
setattr(self,self.a + v )
foo = Foo()
print(foo.test_1,foo.test_2,foo.test_3)
foo = Foo(10)
print(foo.test_1,foo.test_3)
输出:
2 3 4
11 12 13
但是,如果您想将其设置为班级级别,那么@nlair 的回答将关闭。
,您需要强制评估 v
。您可以使用 partial
中的 functools
。我不确定它是否很干净,但它可以满足您的需求。
from functools import partial
class Foo:
def __init__(self):
self.a = 1
for v in [1,3]:
def aux(obj,x):
return obj.a + x
setattr(Foo,property(partial(aux,x=v))
foo = Foo()
print(foo.test_1)
print(foo.test_2)
print(foo.test_3)
输出:
2
3
4