1.软文推荐

2.软文推荐

3.软文推荐

当实现我们自己的父类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参数里面。循环检查每一个方法名是否在禁止的列表中,如果在,就抛出异常。如果不在,就继续后面的创建过程。

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

本文来源:www.lxlinux.net/9559.html,若引用不当,请联系修改。

相关文章 8

1

Docker网络双向连接具体方法 2分钟前

本篇文章重点为大家讲解一下Docker网络双向连接具体方法,有需要的小伙伴可以参考一下。 查看docker网络 dockernetworkls[root@master~] #dockernetw...

2

阿里云怎么关闭防火墙 阿里云ecs关闭防火墙(阿里云怎么关闭oss) 4分钟前

阿里云怎么关闭防火墙 阿里云服务器端口不通?那是因为阿里云需要手动开放安全组(关闭防火墙),这个不是在vps层面操作的,而是需要你...

3

Linux中5个有趣的怀旧游戏 6分钟前

Linux玩游戏,你没听错,我就是要在Linux上整几个简单的经典游戏玩一下。 1.俄罗斯方块 img 俄罗斯方块是俄罗斯软件工程师 Alexey Pajitnov 于 19...

4

Vultr – VPS购买教程[Vultr购买攻略] 免费送20美元 7分钟前

鉴于Vultr是国外网站,很多国内的小伙伴对英文不熟悉(本人也是一见半解但购买VPS还是够用的),特发一个教程,大家可以观摩一下。 1...

5

Dreamhost限时闪购:Shared Unlimited无限主机赠送免费域名!年付仅$35 8分钟前

Dreamhost怎么样?Dreamhost无限主机。DreamHost创建于1997年,现在已经发展成为服务100多个国家,拥有40万+客户,支持着150多万网站,有超过75万的...

6

RAKsmart三月促销:美国独立服务器限量秒杀$30/月起,裸机云/云服务器首月1美元 11分钟前

RAKsmart“全民上云”促销活动来袭,本月商家优惠涵盖云服务器、VPS、裸机云、独立服务器等各类产品,RAK Cloud云服务器/裸机云服务器产品...

7

腾讯云标准型S2云服务器实例配置及如何选择?(腾讯云标准型s5是独享吗) 13分钟前

腾讯云标准型s2服务器是腾讯云目前主力推荐机型,采用英特尔?至强? Broadwell 处理器,搭配 DDR4 内存。提到腾讯云服务器有朋友立即想到了...

8

【便宜】$1.57/月 1核/512M内存/5G SSD/25Mbps/不限流量/洛杉矶/KVM friendhosting 15分钟前

friendhosting是一家保加利亚主机销售商,成立于2009年,主要销售独立服务器和VPS,机房比较多,有荷兰VPS、保加利亚VPS、立陶宛VPS、捷克VP...