关于属性:在python中迭代实例对象的属性

iterate over an instance object's attributes in Python

我有一节课

1
2
3
4
5
6
7
class MyClass():
    def __init__(self):
        self.a = 7
        self.b = 2
    @property
    def aAndB(self):
        return self.a + self.b

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

我的目标是这样一个函数:

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

使用instance.__dict__只给了我ab,而不是aAndB。我想对所有属性/方法及其值进行dict循环,这样我可以搜索某些属性(或用@property修饰的方法)具有特定值的实例。

当前,像这样调用函数

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

使python抱怨aAndB不在instance.__dict__.

也许你们都是对的,答案就在那里,但我还是不明白。上述问题中的所有答案都会得到列表,而不是字典。我想要所有的属性(包括使用@property修饰器的方法)及其值。是否有方法迭代dir(myClass)中键的值?dir命令只包含属性的名称,而不包含它们的值。

我需要类似的东西

1
2
for a in dir(myClass):
    print a, myClass.(a)  # get the value for an attribute stored in a variable

更清楚地说:以下是我想要的,但可能有更好的方法,我不知道。

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


实际上,有一种非常简单的方法可以做到这一点,用getattr代替eval

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

输出:

1
2
3
a 7
aAndB 9
b 2

这有一个很大的优点,即不需要以实例的名义将代码硬编码到字符串中,这是使用eval("myClass.{}".format(a))所必需的。