python - 继承一个非抽象类并将其所有函数转换为抽象方法
问题描述
给了我一个上游接口,它的所有功能都定义为非抽象的,而实际上它们应该用@abstractmethod
s 装饰。当我在调用它时没有实现它的一个功能时,我想收到一个错误。为此,我将创建一个包装类并手动检查其定义的每个函数并执行以下操作:
from abc import ABC, abstractmethod
class Foo(object):
def foo(self):
print("Foo")
class AbstractFoo(Foo, ABC):
@abstractmethod
def foo(self):
return super().foo()
class ConcreteFoo(AbstractFoo):
def foo(self):
print("Concrete Foo")
super().foo()
f = ConcreteFoo()
f.foo()
哪个输出:
Concrete Foo
Foo
我想要某种方式对Foo 定义的所有函数执行此操作。显然,继承的魔术函数喜欢__str__
并且__repr__
应该适当地转发。
有谁知道这样做的好方法?
解决方案
def validate_base_class_implemntation(cls):
base_cls_funcs = []
for attr in cls.__bases__[0].__dict__:
if callable(getattr(cls, attr)):
base_cls_funcs.append(attr)
cls_funcs = []
for attr in cls.__dict__:
if callable(getattr(cls, attr)):
cls_funcs.append(attr)
missing_funcs = [x for x in base_cls_funcs if x not in cls_funcs]
if len(missing_funcs) > 0:
print("Not implemented functions are: {}".format(','.join(missing_funcs)))
raise Exception("Not implement function exception!")
return cls
class Foo(object):
def foo(self):
print("Foo")
def boo(self):
print("Wow")
@validate_base_class_implemntation
class ConcreteFoo(Foo):
def foo(self):
print("Concrete Foo")
super().foo()
f = ConcreteFoo()
f.foo()
如果那是你的意思,100% 不确定。
这个装饰器检查装饰的类是否实现了所有基类函数(在你的情况下,它们没有用抽象装饰)。如果您的装饰类未实现某个功能,则会引发异常。
推荐阅读
- java - 如何刷新 CheckBox 的 JavaFX ListView 并保留其 CheckedProperty?
- java - GridAdapter 导致 java.lang.NullPointerException
- javascript - 在按钮单击时动态添加引导程序 4 列表项
- javascript - 如何为第二个列表项应用默认活动类
- javascript - 在嵌套函数的角度中使用 this 关键字
- excel - 在单元格中显示负值
- c++ - 当一个类在c ++的头文件中继承另一个类时出错
- mysql - 如何在ubuntu的mysql 8中设置root密码
- angular - 不要在 angular dist build 中包含源文件
- c# - 将集合的数据类型从文本转换为数字