日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python写一个类方法_Python基础|类方法的强制重写与禁止重写

發布時間:2025/4/5 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python写一个类方法_Python基础|类方法的强制重写与禁止重写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Python中,類的繼承與函數的重寫,是我們再熟悉不過的知識點。但如何實現,方法的強制重寫與禁止重寫,這大概是很多初學者的一個知識盲區吧?

01

強制重寫

需求:父類一個方法,強制子類去重寫。

實現的方法大約有這兩種:

1、把父類變為抽象基類,然后給指定方法加上裝飾器@abc.abstractmethod

2、指定方法拋出NotImplementedError異常

先來說說第一種

由于定義抽象基類,Py2和Py3有所區別,這里都舉個例。

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()

輸出結果

汪汪...

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

輸出結果,報錯。

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

以上說明,只要把一個方法定義成抽象方法,那解釋器就會要求子類,必須實現(重寫)這個方法,否則就會報TypeError異常。

要注意的是,這個異常在實例化時,就會拋出,而不需要等到調用函數。

再來說說,第二種方法

我們給父類的speak方法,加上拋出異常語句。他會幫我們檢測,這個方法在子類中有沒有被重新實現,沒有的話,就會拋出異常。

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

要注意的是,這個異常只有在調用speak函數時,才會拋出。

02

禁止重寫

其實這個說法并不太準確。實際是可以重寫的,只是無法生效而已。

來看下這個常規的例子。

class?Base:

def?go(self):

print("base")

def?run(self):

self.go()

class?Extend(Base):

def?go(self):

print("extend")

person?=?Extend()

person.run()

輸出結果,很正常,和我們的預期符合。

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

仔細觀察一下,其實區別只有,一個是公開函數,一個私有函數。

于此,我們可以得出結論。

私有函數的作用范圍僅在當前類,其表象上可以被重寫,但實際上并無重寫的效果。

總結

以上是生活随笔為你收集整理的python写一个类方法_Python基础|类方法的强制重写与禁止重写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。