首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

类方法的强制重写与禁止重写

第一时间,获取最新Python干货!

在Python中,类的继承与函数的重写,是我们再熟悉不过的知识点。但如何实现,方法的强制重写与禁止重写,这大概是很多初学者的一个知识盲区吧?

01

强制重写

需求:父类一个方法,强制子类去重写。

实现的方法大约有这两种:

1、把父类变为抽象基类,然后给指定方法加上装饰器@abc.abstractmethod

2、指定方法抛出NotImplementedError异常

先来说说第一种

由于定义抽象基类,Py2和Py3有所区别,这里都举个例。

Python2.x中

输出结果

汪汪...

Traceback (most recent call last):

File"F:/Python Script/hello.py", line116,in

cat = Cat()

TypeError: Can't instantiate abstract class Cat with abstract methods speak

如果是Python3.x中,只需把 Animal 类改成如下即可

classAnimal(metaclass=abc.ABCMeta):

@abc.abstractmethod

defspeak(self):

pass

输出结果,报错。

Traceback (most recentcalllast):

汪汪...

File"F:/Python Script/hello.py", line114,in

cat = Cat()

TypeError: Can't instantiate abstract class Cat with abstract methods speak

以上说明,只要把一个方法定义成抽象方法,那解释器就会要求子类,必须实现(重写)这个方法,否则就会报TypeError异常。

要注意的是,这个异常在实例化时,就会抛出,而不需要等到调用函数。

再来说说,第二种方法

我们给父类的speak方法,加上抛出异常语句。他会帮我们检测,这个方法在子类中有没有被重新实现,没有的话,就会抛出异常。

classAnimal():

defspeak(self):

raiseNotImplemented

classDog(Animal):

defspeak(self):

print("汪汪...")

classCat(Animal):

pass

if__name__ =='__main__':

dog = Dog()

dog.speak()

cat = Cat()

cat.speak()

运行后,报错,提示我们这个方法没有被重写。

汪汪...

Traceback (most recentcalllast):

File"F:/Python Script/hello.py", line114,in

cat.speak()

File"F:/Python Script/hello.py", line101,inspeak

raiseNotImplemented

TypeError:exceptionsmust derivefromBaseException

要注意的是,这个异常只有在调用speak函数时,才会抛出。

02

禁止重写

其实这个说法并不太准确。实际是可以重写的,只是无法生效而已。

来看下这个常规的例子。

classBase:

defgo(self):

print("base")

defrun(self):

self.go()

classExtend(Base):

defgo(self):

print("extend")

person = Extend()

person.run()

输出结果,很正常,和我们的预期符合。

extend

先不要开心太早,来看看下面这个例子

classBase:

def__go(self):

print("base")

defrun(self):

self.__go()

classExtend(Base):

def__go(self):

print("extend")

person = Extend()

person.run()

输出如下,你一定很纳闷,为什么会这样。

base

仔细观察一下,其实区别只有,一个是公开函数,一个私有函数。

于此,我们可以得出结论。

的作用范围仅在当前类,其表象上可以被重写,但实际上并无重写的效果。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180715G11LH400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券