一个python基类,提供各种装饰器来指定与继承相关的承诺。
ipromise的Python项目详细描述
一个python基类,提供各种装饰器来指定与继承相关的承诺。 它提供三种继承模式:
- 实施,
- 覆盖,并且
- 增强。
实施
implementing是继承类的方法从基类方法实现抽象方法的模式。 它是使用decorators声明的:
- abc.abstractmethod来自标准库,并且
- implements,表示方法在基类中实现抽象方法
例如:
class HasAbstractMethod(AbstractBaseClass): @abstractmethod def f(self): raise NotImplementedError class ImplementsAbstractMethod(HasAbstractMethod): @implements(HasAbstractMethod) def f(self): return 0
覆盖
overriding是继承类的方法替换基类方法实现的模式。 它是使用decoratoroverrides声明的,该decorator标记重写方法。
重写方法可以调用super,但不必:
class HasRegularMethod(AbstractBaseClass): def f(self): return 1 class OverridesRegularMethod(HasRegularMethod): @overrides(HasRegularMethod) def f(self): return 2
增大
augmenting是overriding的特例,继承类的方法不仅overrides基类方法,而且extends其功能。 这意味着它必须在所有代码路径中委托给super。 这种模式在多重继承中是典型的。
我们希望python linters能够检查超级调用。
使用两个decorator声明扩充:
- augments表示此方法必须在其定义内调用super,从而增强基类方法的行为,并且
- must_agugment表示定义此方法的子类必须用augments修饰其方法重写
例如:
class HasMustAugmentMethod(AbstractBaseClass): @must_augment def f(self): # must_augment prevents this behavior from being lost. self.times_f_called += 1 return 0 class AugmentsMethod(HasMustAugmentMethod): @augments(HasMustAugmentMethod) def f(self, extra=0, **kwargs): return super().f(**kwargs) + extra class AugmentsMethodFurther(AugmentsMethod): @augments(HasMustAugmentMethod) def f(self, **kwargs): print("f has been called") return super().f(**kwargs)