如何在python中动态设置类属性?

问题描述

我想动态设置类属性。我是这样做的:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...