python写一个类方法_Python基础|类方法的强制重写与禁止重写
在Python中,類的繼承與函數(shù)的重寫,是我們再熟悉不過的知識點。但如何實現(xiàn),方法的強制重寫與禁止重寫,這大概是很多初學(xué)者的一個知識盲區(qū)吧?
01
強制重寫
需求:父類一個方法,強制子類去重寫。
實現(xiàn)的方法大約有這兩種:
1、把父類變?yōu)槌橄蠡?#xff0c;然后給指定方法加上裝飾器@abc.abstractmethod
2、指定方法拋出NotImplementedError異常
先來說說第一種
由于定義抽象基類,Py2和Py3有所區(qū)別,這里都舉個例。
Python2.x中
#?coding:utf-8
import?abc
class?Animal(object):
__metaclass__?=?abc.ABCMeta
@abc.abstractmethod
def?speak(self):
pass
class?Dog(Animal):
def?speak(self):
print("汪汪...")
class?Cat(Animal):
pass
if?__name__?==?'__main__':
dog?=?Dog()
dog.speak()
cat?=?Cat()
cat.speak()
輸出結(jié)果
汪汪...
Traceback?(most?recent?call?last):
File?"F:/Python?Script/hello.py",?line?116,?in?
cat?=?Cat()
TypeError:?Can't?instantiate?abstract?class?Cat?with?abstract?methods?speak
如果是Python3.x中,只需把 Animal 類改成如下即可
class?Animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def?speak(self):
pass
輸出結(jié)果,報錯。
Traceback?(most?recent?call?last):
汪汪...
File?"F:/Python?Script/hello.py",?line?114,?in?
cat?=?Cat()
TypeError:?Can't?instantiate?abstract?class?Cat?with?abstract?methods?speak
以上說明,只要把一個方法定義成抽象方法,那解釋器就會要求子類,必須實現(xiàn)(重寫)這個方法,否則就會報TypeError異常。
要注意的是,這個異常在實例化時,就會拋出,而不需要等到調(diào)用函數(shù)。
再來說說,第二種方法
我們給父類的speak方法,加上拋出異常語句。他會幫我們檢測,這個方法在子類中有沒有被重新實現(xiàn),沒有的話,就會拋出異常。
class?Animal():
def?speak(self):
raise?NotImplemented
class?Dog(Animal):
def?speak(self):
print("汪汪...")
class?Cat(Animal):
pass
if?__name__?==?'__main__':
dog?=?Dog()
dog.speak()
cat?=?Cat()
cat.speak()
運行后,報錯,提示我們這個方法沒有被重寫。
汪汪...
Traceback?(most?recent?call?last):
File?"F:/Python?Script/hello.py",?line?114,?in?
cat.speak()
File?"F:/Python?Script/hello.py",?line?101,?in?speak
raise?NotImplemented
TypeError:?exceptions?must?derive?from?BaseException
要注意的是,這個異常只有在調(diào)用speak函數(shù)時,才會拋出。
02
禁止重寫
其實這個說法并不太準(zhǔn)確。實際是可以重寫的,只是無法生效而已。
來看下這個常規(guī)的例子。
class?Base:
def?go(self):
print("base")
def?run(self):
self.go()
class?Extend(Base):
def?go(self):
print("extend")
person?=?Extend()
person.run()
輸出結(jié)果,很正常,和我們的預(yù)期符合。
extend
先不要開心太早,來看看下面這個例子
class?Base:
def?__go(self):
print("base")
def?run(self):
self.__go()
class?Extend(Base):
def?__go(self):
print("extend")
person?=?Extend()
person.run()
輸出如下,你一定很納悶,為什么會這樣。
base
仔細觀察一下,其實區(qū)別只有,一個是公開函數(shù),一個私有函數(shù)。
于此,我們可以得出結(jié)論。
私有函數(shù)的作用范圍僅在當(dāng)前類,其表象上可以被重寫,但實際上并無重寫的效果。
總結(jié)
以上是生活随笔為你收集整理的python写一个类方法_Python基础|类方法的强制重写与禁止重写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网获取输入rowinput_Pyth
- 下一篇: vs2017python找不到包_关于P