2009-07-31 59 views
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>。我应该如何定义它才能工作?

+0

通常情况下,我们定义了一个固定的,明显的,不变的名称的属性。然后我们使用getattr来灵活地引用属性。你想用这个完成什么?什么是更大的图片?可能有一种更简单的方法;请提供背景资料,以便我们能够提出一些实际可行的建议。 – 2009-07-31 13:20:34

回答

2

尽管我会说,不同之处在于,在第一个版本中,将类属性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")) 
1

一种方法是写入到当地人():

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 
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有一个字符串属性的名称,并相应地做一些事情吧。

相关问题