1

我正在尝试获取一个属性来打印它在python的所有者类中分配的名称,并且我已经制定了一种方法,当且仅当直接分配该属性时该方法才有效。如果属性是继承的,它就不起作用,如下图所示。有什么好方法可以在您调用任何一个Handler.CLIENT_ID或始终打印SubHandler.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
4

1 回答 1

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
于 2012-09-29T17:41:10.033 回答