【问题标题】:How to dynamically access class properties in Python?如何在 Python 中动态访问类属性?
【发布时间】:2010-03-11 13:35:10
【问题描述】:

假设我创建了一个类的实例并希望为其公共属性分配一些值。通常,这将是这样完成的:

class MyClass:
    def __init__(self):
        self.name = None
        self.text = None

myclass = MyClass()
myclass.name = 'My name'

但是,如果编写一个将类作为参数的函数,并且我想动态地为该类的公共属性分配一些值——即通过变量和循环(不知道有多少或它们是什么),该怎么办?被调用。)

显而易见的是:

myclass = MyClass()
myclass['name'] = "My name"

但这不起作用。

有什么想法吗?

【问题讨论】:

标签: python class


【解决方案1】:
setattr(my_class_instance, 'attr_name', attr_value)

【讨论】:

    【解决方案2】:

    在阅读被拒绝的Syntax For Dynamic Attribute Access 之后,我正在使用一个 mixin 类,提供对对象属性的字典式访问:

    class MyClass:
        def __init__(self):
            self.name = None
            self.text = None
        def __getitem__(self, name):
            return getattr(self, name)
        def __setitem__(self, name, value):
            return setattr(self, name, value)
        def __delitem__(self, name):
            return delattr(self, name)
        def __contains__(self, name):
            return hasattr(self, name)
    

    虽然仍然可以直接设置属性:

    myclass = MyClass()
    myclass.name = "foo"
    myclass.text = "bar"
    

    然后可以动态设置它们:

    for attr in ('name', 'text'):
        myclass[attr] = confirm(attr, default=myclass[attr])
    

    【讨论】:

      【解决方案3】:

      使用dirsetattr 应该可以完成这项工作

      class MyClass:
        def __init__(self):
          self.name = None
          self.text = None
      
      myclass = MyClass()
      myclass.name = 'My name'
      
      for prop in dir(myclass):
          print '%s:%s'%(prop,getattr(myclass,prop))
      
      print
      
      for prop in dir(myclass):
          if prop[:2]!='__' and prop[-2:]!='__':
              print prop[-2:]
              setattr(myclass,prop,"Foo Bar")
      
      for prop in dir(myclass):
          print '%s:%s'%(prop,getattr(myclass,prop))    
      

      但要小心,因为此代码还将'__doc__', '__init__', '__module__' 属性设置为“Foo Bar”。所以你必须注意避免dir给你的某些东西(尤其是那些以__双下划线开头和结尾的东西)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2013-07-12
        • 2010-12-28
        • 1970-01-01
        • 1970-01-01
        • 2022-09-22
        • 1970-01-01
        相关资源
        最近更新 更多