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

2024-04-24 23:51:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

显而易见的是:

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

但那不管用。

有什么想法吗?


Tags: 实例函数textnameselfnone参数属性
3条回答

在读取被拒绝的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])

使用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(特别是那些以__双下划线开头和结尾的)给您的某些东西。

setattr(my_class_instance, 'attr_name', attr_value)

相关问题 更多 >