第一时间,获取最新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
仔细观察一下,其实区别只有,一个是公开函数,一个私有函数。
于此,我们可以得出结论。
的作用范围仅在当前类,其表象上可以被重写,但实际上并无重写的效果。
领取专属 10元无门槛券
私享最新 技术干货