如何从Python类中查找属性的名称

时间:2012-09-29 17:36:28

标签: python introspection

我正在尝试获取一个属性来打印它在python中的所有者类中分配的名称,并且我已经找到了一个方法,当且仅当属性被直接分配时才会起作用。如果属性是继承的,它不起作用,如下所示。什么是好方法,以便当您拨打Handler.CLIENT_IDSubHandler.CLIENT_ID时,始终会打印变量名称CLIENT_ID

class Auto(object):
    def __get__(self, instance, owner):
        attr_name = (k for (k, v) in owner.__dict__.iteritems() if v == self).next()
        return attr_name

class Handler(object):
    name = 'account'

    CLIENT_ID = Auto()

class SubHandler(Handler):
    pass

h = Handler()
print h.CLIENT_ID
# prints CLIENT_ID
s = SubHandler()
print s.CLIENT_ID
# Traceback (most recent call last):
#    attr_name = (k for (k, v) in owner.__dict__.iteritems() if v == self).next()
# StopIteration

1 个答案:

答案 0 :(得分:2)

您可以使用类的__mro__属性遍历基类,在每个类“__dict__中查找属性:

class Auto(object):
    def __get__(self, instance, owner):
        attr_name = (k 
            for klass in owner.__mro__
            for (k, v) in klass.__dict__.iteritems() 
            if v == self).next()
        return attr_name

“mro”代表方法解析顺序,是python将查找方法和其他类定义属性的顺序的基类列表。扫描此列表意味着您将按照Python使用的相同顺序在基类中查找属性。

您的示例代码可正常使用上述代码:

>>> h = Handler()
>>> print h.CLIENT_ID
CLIENT_ID
>>> s = SubHandler()
>>> print s.CLIENT_ID
CLIENT_ID