一个python基类,提供各种装饰器来指定与继承相关的承诺。

ipromise的Python项目详细描述


https://badge.fury.io/py/ipromise.svg

一个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

增大

augmentingoverriding的特例,继承类的方法不仅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)

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java构造函数SimpleCommandBus()不可见   Java字符串和返回   java不能在类中使用上下文?   使用Java为SOAP定制DataHandler   java“访问被拒绝”在编译servlet时   java嵌入Jetty,在给定时间后终止请求   java如何使用预先指定的URL限制AWS S3 bucket中对象的上传大小?   java理解Azure文件存储:未知hostException   java将对象作为参数传递是否会产生与将其存储在字段中相同级别的耦合?   https告诉java客户端代码接受自签名证书   Java中的简单*权威DNS服务器*   Java解压缩字节数组错误数据检查   当我用SpringDoc和接口描述API规范时,java Spring控制器验证似乎不起作用   在Java中使用PHash(OpenCV)   Kotlin中的java简单继承示例   java Infinispan:ISPN004016:服务器不再位于群集中(127.0.0.1:11222),正在从池中删除   2行滑动菜单安卓本机JAVA   使用日期选择器时Android Studio中的java 4错误   java在<之间删除内容!和/>