gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:55:48 25 4
gpt4 key购买 nike

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

最佳答案

您可以使用类的 __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

关于python - 如何从 Python 类中查找属性名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12654900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com