3

使用 Python 我想在一个类中创建一个属性,但它的名称在一个字符串中。通常你会:

blah = property(get_blah, set_blah, del_blah, "bleh blih")

其中 get_、set_ 和 del_blah 已相应定义。我尝试对变量中的属性名称执行相同的操作,如下所示:

setattr(self, "blah", property(self.get_blah, self.set_blah, self.del_blah, "bleh blih"))

但这不起作用。第一种情况 blah 返回属性的值,在第二种情况下,它返回一个属性,即<property object at 0xbb1aa0>. 我应该如何定义它才能正常工作?

4

3 回答 3

2

正如我要说的,不同之处在于,在第一个版本中,您将 classes 属性 blah 更改为 property 的结果,而在第二个版本中,您将其设置为实例(这是不同的!)。

这个版本怎么样:

setattr(MyClass, "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))

你也可以这样做:

setattr(type(self), "blah", property(self.get_blah, self.set_blah,
        self.del_blah, "bleh blih"))
于 2009-07-31T13:38:45.570 回答
1

一种方法是写入 locals():

class X:
    for attr in ["a","b","c"]:
        def getter(self, name=attr):
            return name+"_value"
        locals()[attr] = property(getter, None, None, attr)

x = X()
print x.a
print x.b
print x.c

a_value
b_value
c_value
于 2009-07-31T13:30:55.980 回答
1

如果我理解你想要做什么,你可以通过覆盖类的getattrsetattr方法来完成它。

例如:

class Something(object):
    def __getattr__(self, name):
        # The name of the property retrieved is a string called name
        return "You're getting %s" % name

something = Something()

print something.foo
print something.bar

将打印:

You're getting foo
You're getting bar

这样,您可以拥有一个通用的 getter 和 setter,它们在字符串中具有属性的名称,并相应地对其进行处理。

于 2009-07-31T13:33:37.820 回答