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

47 投票
4 回答
29446 浏览
提问于 2025-04-15 20:18

假设我创建了一个类的实例,并想给它的公共属性赋一些值。通常,这样做的方法是:

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

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

但是,如果我写了一个函数,这个函数接受一个类作为参数,我想动态地给这个类的公共属性赋值,也就是说通过变量和循环来赋值(而不需要知道有多少个属性或者它们的名字是什么)。

那么,显而易见的方法是:

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

但这样做是行不通的。

有没有什么好主意呢?

4 个回答

2

使用 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 给你提供的一些特定内容(特别是那些前后都有 __ 双下划线的东西)。

20

在阅读了被拒绝的动态属性访问的语法后,我使用了一个混合类,这个类可以像使用字典一样访问对象的属性:

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])
57

在编程中,有时候我们需要让程序在特定的条件下运行某些代码。比如说,当你点击一个按钮时,程序就会执行一些操作。这个过程就叫做“事件处理”。

事件处理的基本思路是:你先定义一个“事件”,然后告诉程序在这个事件发生时要做什么。比如,当用户点击按钮时,你可以让程序显示一条消息或者改变页面的内容。

为了实现这个功能,通常会用到一些编程语言提供的工具和方法。你需要把这些工具和方法结合起来,才能让程序按照你的想法运行。

总之,事件处理就是让程序根据用户的操作来做出反应,这样用户的体验会更好。

setattr(my_class_instance, 'attr_name', attr_value)

撰写回答