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

Hon*_*rny 27 python class

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

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

myclass = MyClass()
myclass.name = 'My name'
Run Code Online (Sandbox Code Playgroud)

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

显而易见的是:

myclass = MyClass()
myclass['name'] = "My name"
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

有任何想法吗?

shy*_*ent 36

setattr(my_class_instance, 'attr_name', attr_value)
Run Code Online (Sandbox Code Playgroud)

  • 文档可以在这里找到:http://docs.python.org/library/functions.html (4认同)

小智 10

阅读被拒绝的动态属性访问语法后,我使用了一个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)
Run Code Online (Sandbox Code Playgroud)

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

myclass = MyClass()
myclass.name = "foo"
myclass.text = "bar"
Run Code Online (Sandbox Code Playgroud)

然后可以动态设置它们:

for attr in ('name', 'text'):
    myclass[attr] = confirm(attr, default=myclass[attr])
Run Code Online (Sandbox Code Playgroud)