如何在超类中获取以 python 中相同的两个字母开头的子类中所有方法的全名

How to get in a superclass full names of all methods in subclasses that start with the same two letters in python

我有许多子classes,它们都有许多名称以“on..”开头的方法 例如:

def on_index(self):
    raise NotImplementedError()

def on_spiking_intent(self):
    raise NotImplementedError()

def on_no_option(self):
    raise NotImplementedError()

我想在 superclass 中写一个方法,打印它的 subclasses 的所有“on...”方法的列表,并指定到哪个 subclass方法属于。

我想这个 get_all_on_methods 方法不需要在 superclass 中,但我把它放在那里是有意义的,因为只有 superclass 联合 subclasses.

我该怎么办?我正在考虑以某种方式使用像 put

这样的装饰器
@onmethod

在每个“on...”方法之前或以某种方式使用抽象 class。但是我其实不知道。

您可以使用 __subclasses__() 方法迭代某些 class 的子classes。您可以检查 subclasses 的名称空间以查找以 "on_" 开头的属性,因此效果为:

class Ur:
    @classmethod
    def get_all_on_methods(cls):
        results = []
        for klass in cls.__subclasses__():
            for name, attribute in vars(klass).items():
                if name.startswith("on_"):
                    results.append((attribute, klass))
        return results

class Foo(Ur):
    def on_index(self):
        pass
    def some_method(self):
        pass

class Bar(Ur):
    def on_spiking_intent(self):
        pass
    def another_method(self):
        pass

这会填充一个列表以供说明之用,您可以轻松地填充字典或任何您想要的内容。

此外,这会获取任何 class 属性,因此您可能需要使用以下方法检查它是否是一种方法:

if callable(attribute) and name.startswith("on_"):
    ...

但这取决于你。

这是您在上述示例中获得的输出:

In [2]: Ur.get_on_methods()
Out[2]:
[(<function __main__.Foo.on_index(self)>, __main__.Foo),
 (<function __main__.Bar.on_spiking_intent(self)>, __main__.Bar)]