如何在Python中动态访问类属性?
假设我创建了一个类的实例,并想给它的公共属性赋一些值。通常,这样做的方法是:
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
使用 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"。所以你需要注意避免使用 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)