在 Python Class 中列出实现的方法

Listing Implemented Methods in Python Class

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

中实现除解算器以外的任何属性或任何方法

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

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

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

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

    class Empty:
        pass

我想知道是否存在比 kludgey Empty class.

更优雅的实现方法

一种方法是:

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

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

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

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

>>> class A: pass
...

它给出:

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

还有:

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

它returns:

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

您可以使用 dir 来完成,例如:

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

显式优于隐式,您可能希望使用非求解器方法 class。最简单的显式但干燥的解决方案是仅使用装饰器来标记哪些方法应被视为 "solver" 方法:

def solver(fun):
    fun.is_solver = True
    return fun

class Solvers(object):
    @solver
    def foo(self):
        return "foo"

    @solver
    def bar(self):
        return "bar"

    @classmethod
    def list_solvers(cls):
        return [name for name, attr 
                in cls.__dict__.items() 
                if getattr(attr, "is_solver", False)]