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

2024-05-29 10:51:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图让一个属性打印它在python中的owner类中分配给它的名称,并且我已经找到了一个方法,当且仅当属性被直接赋值时,它才有效。如果属性是继承的,则不起作用,如下所示。当您调用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

Tags: 方法nameinselfclientidforauto
1条回答
网友
1楼 · 发布于 2024-05-29 10:51:56

可以使用类的__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使用的相同顺序在基类中查找属性。在

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

^{pr2}$

相关问题 更多 >

    热门问题