代码之家  ›  专栏  ›  技术社区  ›  Pablo Fernandez

如何创建名称在字符串中的属性?

  •  3
  • Pablo Fernandez  · 技术社区  · 15 年前

    使用python,我希望在类中创建一个属性,但将其名称放在字符串中。通常你会这样做:

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

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

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

    但那不管用。第一个case blah返回属性的值,第二个case返回属性,即 <property object at 0xbb1aa0> . 我应该如何定义它才能工作?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Pablo Fernandez    15 年前

    正如我想说的,区别在于,在第一个版本中,您将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"))
    
        2
  •  1
  •   Martin v. Löwis    15 年前

    一种方法是写入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
    
        3
  •  1
  •   Andre Miller    15 年前

    如果我理解你想做什么,你可以通过重写类的 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,该getter和setter在字符串中具有属性的名称,并对其进行相应的处理。