如何在超类中获取以 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)]
我有许多子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)]