我正在尝试获取一个属性来打印它在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
答案 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