- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
hasattr(obj, attribute)
用于检查一个对象是否具有指定的属性,但是给定一个属性是否有办法知道它在哪里(全部)定义?
假设我的代码获取属性(或类方法)的名称作为字符串,我想调用 classname.attribute
但我没有类名。
我想到的一个解决方案是这个
def finder(attr):
for obj in globals():
try:
if globals()[obj].__dict__[attr]:
return(globals()[obj])
except:
...
用法:
class Lime(object):
@classmethod
def lfunc(self):
print('Classic')
getattr(finder('lfunc'),'lfunc')() #Runs lfunc method of Lime class
我很确定这不是最好的(甚至是正确的方法)。有人可以提供更好的方法吗。
最佳答案
总是“可能的”。是否可取是另一段历史。
一种快速而肮脏的方法是线性迭代所有类并检查是否有任何定义您拥有的属性。当然,这是有冲突的,它会产生第一个具有这样一个命名属性的类。如果它存在于不止一个中,则由您决定您想要哪个:
def finder(attr):
for cls in object.__subclasses__():
if hasattr(cls, attr):
return cls
raise ValueError
它不是在“globals”中搜索,而是搜索“object”的所有子类 - 因此要查找的类不需要位于 finder
函数所在模块的命名空间中。
但是,如果您的方法在您正在搜索的一组类中是唯一的,也许您可以组装所有方法的映射并使用它来调用它们。
让我们假设您所有的类都来自名为“Base”的类:
mapper = {attr_name:getattr(cls, attr_name) for cls in base.__subclasses__() for attr_name, obj in cls.__dict__.items()
if isinstance(obj, classmethod) }
然后你用mapper['attrname']()
调用它们
这避免了在每个方法调用时进行线性搜索,因此会好得多。
- 编辑 -
__subclassess__
只是找到一个类的直接子类,而不是继承树——所以它在“现实生活”中没有用处——也许是在 OP 的特定情况下手。
如果需要在继承树中查找内容,则还需要对每个子类进行递归。
至于旧式类:这当然行不通——这是在新代码中默认破坏它们的动机之一。
至于非类属性:无论如何只能在检查实例时找到它们 - 所以必须考虑另一种方法 - 似乎不是 O.P. 关心的问题。
关于python - Python 中 hasattr 的逆运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16042880/
这个问题在这里已经有了答案: Convert hashtable back to string data in efficient way (1 个回答) 关闭 2 年前。 我找到了以下代码,用于从
我是一名优秀的程序员,十分优秀!