gpt4 book ai didi

python - 列出 Python 类中已实现的方法

转载 作者:行者123 更新时间:2023-11-28 16:33:19 25 4
gpt4 key购买 nike

我正在编写一段科学代码,我们希望在其中实现多个求解器并比较它们。我们正在使用一个配置文件,我们可以在其中声明我们希望应用的求解器的名称。由于我们不断添加新的求解器,我将它们包含在一个类中,这样我们就可以从配置文件中提取名称并使用 getattr 应用该名称,而无需向代码中添加任何新内容除了求解器方法本身。除了此类中的求解器,我没有实现任何属性或任何方法。

我还实现了一条错误消息,以防所选求解器不存在。整个 block 看起来像这样:

try:
solver = getattr(Solvers,control['Solver'])
except AttributeError:
print('\n Invalid Solver Choice! Implemented solvers are: \n' \
+ str(set(dir(Solvers)) - set(dir(Empty)))) # Implemented solvers
raise
solver(inputs) # Call the desired solver

这很方便,因为它会通过添加新方法自动更新我们的错误处理。我的问题与那里的错误消息有关。具体来说,我想返回已实现求解器的列表,并且已实现求解器。

仅仅列出 dir(Solvers) 的输出是不够的,因为这包括许多其他方法,例如 __init__。同样,我无法设置减去 dir(object) 的结果,因为这最终仍会返回一些额外的东西,例如 __dict____module__。这就是为什么我有 Empty 类,它只是:

    class Empty:
pass

我想知道是否存在比 kludgey Empty 类更优雅的实现方式。

最佳答案

一种方法是:

set(A.__dict__) - set(type.__dict__)

但是,它仍然会返回__weakref__。相反,您可以使用:

set(A.__dict__) - set(type("", (), {}).__dict__)

它将您的类与 type("", (), {}) 进行比较。这将创建一个新的类对象,就像您的 Empty,但更微妙一些。对于示例类:

>>> class A: pass
...

它给出:

>>> set(A.__dict__) - set(type("", (), {}).__dict__)
set()

对于:

>>> class B:
... def f(self): pass
...

它返回:

>>> set(B.__dict__) - set(type("", (), {}).__dict__) 
{'f'}

你可以像这样用 dir 来做:

>>> set(dir(B)) - set(dir(type("", (), {})))
{'f'}

关于python - 列出 Python 类中已实现的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29625489/

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