阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

禁止 Python 子类覆盖父类方法

57次阅读
没有评论

共计 1393 个字符,预计需要花费 4 分钟才能阅读完成。

导读 当实现我们自己的父类 Animal 的时候,由于 meta.has_base 为 False,所以不会触发检查逻辑。但当我们基于 Animal 实现 Dog 子类的时候,由于 meta.has_base 是 True,所以进入检查逻辑。Dog 的所有方法名都在 attrs 参数里面。循环检查每一个方法名是否在禁止的列表中,如果在,就抛出异常。如果不在,就继续后面的创建过程。

禁止 Python 子类覆盖父类方法

当子类试图覆盖父类的时候,可以通过类型标注来发出警告。今天,我们来讲讲如何直接禁止覆盖。

Python 原生是没有提供禁止子类覆盖父类的方法的功能,因此我们需要自己来实现。

先来看一下实现效果:

禁止 Python 子类覆盖父类方法

在这段代码里面,我们禁止子类覆盖父类的 dead() 和 eat() 方法,但不禁止 move 方法。所以,当我们在子类 Dog 里面尝试覆盖父类中的 dead() 时,程序就报错了。具体要覆盖哪些方法,可以在定义类的时候指定,传入的参数 metaclass=protect(‘ 方法 1 ’, ‘ 方法 2 ’, ‘ 方法 3 ’, …) 就可以了。

那么这个 protect 函数是个什么东西呢? 我们来看看它的代码:

def protect(*protected): 
    """Returns a metaclass that protects all attributes given as strings""" 
    class Protect(type): 
        has_base = False 
        def __new__(meta, name, bases, attrs): 
            if meta.has_base: 
                for attribute in attrs: 
                    if attribute in protected: 
                        raise AttributeError('Overriding of attribute"%s"not allowed.'%attribute) 
            meta.has_base = True 
            klass = super().__new__(meta, name, bases, attrs) 
            return klass 
    return Protect

这里,用到了 Python 的元类。如果大家对元类有兴趣,可以看 9.13 使用元类控制实例的创建 — python3-cookbook 3.0.0 文档 [1]。简单的来说,元类用来定义类的创建行为。它一般的格式为:

class 类名 (metaclass= 另一个类): 
   ...

而大家看我们用来禁止重试的这个函数 protect,它返回的就是一个 Protect 类。这个类继承于 type 对象。

Protect 类有一个__new__方法,这个方法会在使用了元类的所有子类的__init__之前被调用。在__new__里面,我们拿到了子类要定义的方法,并且检查他们是不是在我们传给 protect 的列表里面。如果在,说明这个方法不能被覆盖。

当实现我们自己的父类 Animal 的时候,由于 meta.has_base 为 False,所以不会触发检查逻辑。但当我们基于 Animal 实现 Dog 子类的时候,由于 meta.has_base 是 True,所以进入检查逻辑。Dog 的所有方法名都在 attrs 参数里面。循环检查每一个方法名是否在禁止的列表中,如果在,就抛出异常。如果不在,就继续后面的创建过程。

元类在理解上可能比较困难。如果大家无法理解上面这一段也没有关系,直接用就是了。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1393字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中