迭代Python中的实例对象的属性

时间:2017-03-03 14:21:09

标签: python properties

我有一个班级

class MyClass():
    def __init__(self):
        self.a = 7
        self.b = 2
    @property
    def aAndB(self):
        return self.a + self.b

我想要一个迭代所有属性的函数,只返回具有特定属性的类实例。

我的目标是这样的功能:

def findInstances(listOfInstances, instanceVariable, instanceValue):
    #return all instances in listOfInstances where instanceVariable==instanceValue

使用instance.__dict__仅向我ab,但不是 aAndB。我希望有一个所有属性/方法的字典及其值的循环,所以我可以搜索某个属性(或用@property修饰的方法)具有特定值的实例。

目前,正在调用此函数

findInstances(someListOfInstances, 'aAndB', '23')

让Python抱怨aAndB不在instance.__dict__.

也许你们所有人都是对的,答案就在那里,但我仍然没有得到它。上述问题中的所有答案都会得到列表,而不是字典。我想要所有属性(包括带有@property装饰器的方法)及其值。有没有办法迭代dir(myClass)中的键值? dir命令仅包含属性的名称,而不包含其值。

我需要像

这样的东西
for a in dir(myClass):
    print a, myClass.(a)  # get the value for an attribute stored in a variable

更清楚:以下内容完全符合我的要求,但可能有更好的方法,我不知道。

for a in dir(myClass):
    print a, eval("myClass.{}".format(a))

1 个答案:

答案 0 :(得分:2)

实际上这是一种非常简单的方法,使用getattr代替eval

myClass = MyClass()
for a in dir(myClass):
    if(a[:2] != "__"): #don't print double underscore methods
        print a, getattr(myClass, a)

输出:

a 7
aAndB 9
b 2

这具有非常大的优势,即不需要将实例名称中的硬编码到字符串中,如使用eval("myClass.{}".format(a))所需