使用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>
。我应该如何定义它以便它起作用?
答案 0 :(得分:2)
正如我要说的那样,区别在于,在第一个版本中,您将classes属性blah更改为属性的结果,而在第二个版本中,您将其设置为实例(这是不同的!)。
这个版本怎么样:
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"))
答案 1 :(得分: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
答案 2 :(得分:1)
如果我理解你要做的事情,你可以通过覆盖班级的getattr和setattr方法来完成它。
例如:
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,它在字符串中具有属性的名称,并相应地对其进行处理。