【问题标题】:How to create a property with its name in a string?如何在字符串中创建其名称的属性?
【发布时间】:2009-07-31 13:06:47
【问题描述】:

使用 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>。我应该如何定义它才能发挥作用?

【问题讨论】:

  • 通常,我们用一个固定的、明显的、不变的名称来定义属性。然后我们使用 getattr 来灵活地引用属性。你想用这个来完成什么?更大的图景是什么?可能有一种更简单的方法;请提供背景信息,以便我们提出实际可行的建议。
  • 我正在创建一个类来保存进程的配置,它将有大量的属性,在设置、获取、验证、记录等方面都非常相似。我正在尝试删除代码重复。
  • @J. Pablo Fernández:请更新您的问题。 cmets 不是放置重要信息的地方。听起来您只是在谈论一个包装属性值字典的类。但是您需要提供一些有关您的用例的详细信息。不仅仅是你可以塞进评论。这是你的问题;请更新它。

标签: python properties setattr


【解决方案1】:

正如我要说的,不同之处在于,在第一个版本中,您将 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"))

【讨论】:

    【解决方案2】:

    一种方法是写入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】:

      如果我理解你想要做什么,你可以通过覆盖类的 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,它们在字符串中包含属性的名称,并相应地对其进行处理。

      【讨论】:

        猜你喜欢
        • 2015-05-22
        • 2013-08-17
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 2020-04-21
        相关资源
        最近更新 更多