代码之家  ›  专栏  ›  技术社区  ›  Honza Pokorny

如何在python中动态访问类属性?

  •  24
  • Honza Pokorny  · 技术社区  · 16 年前

    假设我创建了一个类的实例,并想为它的公共属性分配一些值。通常情况下,这样做:

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

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

    显而易见的是:

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

    但那不管用。

    有什么想法吗?

    3 回复  |  直到 11 年前
        1
  •  37
  •   shylent    16 年前
    setattr(my_class_instance, 'attr_name', attr_value)
    
        2
  •  8
  •   r2rien    11 年前

    阅读被拒绝后 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
  •  0
  •   Pratik Deoghare    16 年前

    使用 dir 具有 setattr 应该做这个工作

    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”。所以你必须注意避免 迪尔 (尤其是那些以 __ 双下划线)。

    推荐文章