亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
1. 什麼是類別和對(duì)象
2. 即然有了函數(shù),為什麼還要有類別?
3. Python 如何定義公有/保護(hù)/私有屬性/方法?私有是、否是真正的私有,這樣做的目的是什麼?
4. 如何定義類別函數(shù)、成員函數(shù)、靜態(tài)函數(shù),他們的作用分別是什麼?
5. 類別可以被繼承,如何讓子類別必須重寫父類別的函數(shù)才能使用,否則拋出例外?
6. 有下列繼承關(guān)係: A,B(A),C(A),D(B ,C) 那麼D 在初始化的時(shí)候,A,B,C 的初始化順序是怎麼樣的?A 是否會(huì)初始化兩次?
首頁(yè) 後端開發(fā) Python教學(xué) Python 關(guān)於物件導(dǎo)向的六個(gè)問題

Python 關(guān)於物件導(dǎo)向的六個(gè)問題

Apr 11, 2023 pm 08:43 PM
python 程式設(shè)計(jì) 對(duì)應(yīng)

本文寫給初學(xué)Python 的朋友,試著講明白以下問題:

  • 什麼是類別和物件?
  • 即有了函數(shù),為什麼還要有類別?
  • Python 如何定義公有/保護(hù)/私有屬性/方法?私有是否是真正的私有,這樣做的目的是什麼?
  • #如何定義類別函數(shù)、成員函數(shù)、靜態(tài)函數(shù),他們的作用分別是什麼?
  • 類別可以被繼承,如何讓子類別必須重寫父類別的函數(shù)才能使用,否則拋出異常?
  • 有下列繼承關(guān)係: A,B (A),C(A),D(B,C) 那麼D 在初始化的時(shí)候,A,B,C 的初始化順序是怎麼樣的?A 是否會(huì)初始化兩次?

1. 什麼是類別和對(duì)象

先說對(duì)象,對(duì)象通常有兩層意思,指行動(dòng)或思考時(shí)作為目標(biāo)的事物或特指戀愛的對(duì)方。在程式設(shè)計(jì)的世界裡,物件就是客觀世界中存在的人、事、物件等實(shí)體在電腦邏輯中的映射。

程式設(shè)計(jì)時(shí),你可以將物件映射成任何你想映射的東西,只不過,映射的如果更符常規(guī)時(shí),程式碼更容易使用和理解,也更有利於後續(xù)的快速迭代和擴(kuò)展。在 Python 的世界裡,萬(wàn)物皆物件。

再說說類,類別就是分類的類,代表一群有著相似性的事物的集合,對(duì)應(yīng) Python 關(guān)鍵字 class。

物件是類別中一個(gè)具體的事物,是由類別初始化後產(chǎn)生的,通常也叫 object,或是實(shí)體,例如女人是一個(gè)類,而你的女朋友就是一個(gè)物件。

屬性:物件的某個(gè)靜態(tài)特徵,例如你女朋友的膚色,民族,血型等。

函數(shù):物件的某個(gè)動(dòng)態(tài)能力,例如你女朋友會(huì)唱歌、彈琴等。

雖然舉的例子可能不太恰當(dāng),但希望能加深你的理解,其實(shí)更為確切的定義如下:

類別是一群有著相同屬性和函數(shù)的對(duì)象的集合。

2. 即然有了函數(shù),為什麼還要有類別?

函數(shù)是為了解決程式碼複用的,但是函數(shù)是過程思維,太具體,太具體的東西就會(huì)有很多重複,因此我們還需要對(duì)問題進(jìn)行抽象,而類就是一種抽象,抽象的類,其可復(fù)用性更高,更容易面對(duì)複雜的業(yè)務(wù)邏輯,也會(huì)減輕程式設(shè)計(jì)師程式設(shè)計(jì)時(shí)的記憶壓力。

如果沒有類,我們更容易寫出屎山一樣的程式碼,牽一發(fā)而動(dòng)全身,不敢修改。有了類,我們更容易寫出易讀、易於維護(hù)、可擴(kuò)展的程式碼。

3. Python 如何定義公有/保護(hù)/私有屬性/方法?私有是、否是真正的私有,這樣做的目的是什麼?

Python 以下列形式約定保護(hù)/私有的屬性/方法:

  • __ 表示私有
  • _ 表示保護(hù)
  • #除前兩者外就是公有

所謂約定,就是你看到雙下劃線或單下劃線開頭的變數(shù)或方法時(shí)就自覺不要在類別的外部修改或存取它,換句話說Python 並不會(huì)阻礙程式設(shè)計(jì)師去存取類別的私有屬性或私有方法,Python 選擇相信程式設(shè)計(jì)師。

存取公有屬性和存取保護(hù)屬性沒有區(qū)別,要存取私有的話需要這樣:

object._ClassName__PrivateMember

4. 如何定義類別函數(shù)、成員函數(shù)、靜態(tài)函數(shù),他們的作用分別是什麼?

看註解吧:

class Document():

WELCOME_STR = 'Welcome! The context for this book is {}.'

def __init__(self, title, author, context):
print('__init__函數(shù)被調(diào)用')
self.title = title
self.author = author
self.__context = context

#類函數(shù)
@classmethod
def create_empty_book(cls, title, author):
return cls(title=title, author=author, context='nothing')

# 成員函數(shù)
def get_context_length(self):
return len(self.__context)

# 靜態(tài)函數(shù)
@staticmethod
def get_welcome(context):
return Document.WELCOME_STR.format(context)
empty_book = Document.create_empty_book('What Every Man Thinks About Apart from Sex', 'Professor Sheridan Simove')
print(empty_book.get_context_length())
print(empty_book.get_welcome('indeed nothing'))

類別函數(shù)以@classmethod 裝飾,第一個(gè)參數(shù)必須為cls,代表類別本身,也就是說,我們可以在classmethod 函數(shù)裡面呼叫類別的構(gòu)造函數(shù)cls(),從而產(chǎn)生一個(gè)新的實(shí)例。從這一點(diǎn),可以推斷它的使用場(chǎng)景:

  • 當(dāng)我們需要再次呼叫建構(gòu)函式時(shí),也就是建立新的實(shí)例物件時(shí)
  • 需要不修改現(xiàn)有實(shí)例的情況下傳回一個(gè)新的實(shí)例。

成員函數(shù)很普通,就是物件可以直接呼叫的方法,第一個(gè)參數(shù)必須是 self。

靜態(tài)函數(shù),以@staticmethod 裝飾,通常就表示這個(gè)函數(shù)的計(jì)算不涉及類別的變量,不需要類別的實(shí)例化就可以使用,也就是說該函數(shù)和這個(gè)類別的關(guān)係不是很近,換句話說,使用staticmethod 裝飾的函數(shù),也可以定義在類別的外部。我有時(shí)會(huì)糾結(jié)到底放在類別裡面使用 staticmethod,還是放在 utils.py 中單獨(dú)寫一個(gè)函數(shù)。

5. 類別可以被繼承,如何讓子類別必須重寫父類別的函數(shù)才能使用,否則拋出例外?

兩種方法,推薦第二種。

第一種:

class A:
def fun(self):
raise Exception("not implement")
class B(A):
pass

b = B()
b.fun()

第二種:

from abc import ABCMeta,abstractmethod
class A(metaclass = ABCMeta):
@abstractmethod
def fun(self):
pass
class B(A):
pass

b = B()
b.fun()

6. 有下列繼承關(guān)係: A,B(A),C(A),D(B ,C) 那麼D 在初始化的時(shí)候,A,B,C 的初始化順序是怎麼樣的?A 是否會(huì)初始化兩次?

---> B---
A--->D
---> C---

A,B,C 的初始化順序是怎麼樣的,不妨寫程式看看。

有兩種方式,第一種 A 是會(huì)初始化兩次,第二種不會(huì)。

第一種:

class A:
def __init__(self):
print("A is called")class B(A):
def __init__(self):
print("B is called")
A.__init__(self)class C(A):
def __init__(self):
print("C is called")
A.__init__(self)class D(B,C):
def __init__(self):
print("D is called")
B.__init__(self)
C.__init__(self)

d = D()

輸出:

D is called
B is called
A is called
C is called
A is called

第二個(gè):

class A:
def __init__(self):
print("enter A")
print("levave A")class B(A):
def __init__(self):
print("enter B")
super().__init__()
print("levave B")class C(A):
def __init__(self):
print("enter C")
super().__init__()
print("levave C")class D(B,C):
def __init__(self):
print("enter D")
super().__init__()
print("levave D")

d = D()

輸出;

enter D
enter B
enter C
enter A
levave A
levave C
levave B
levave D

第一種方法非常明確的表明了菱形繼承潛在的問題:一個(gè)基類的初始化函數(shù)可能被調(diào)用兩次。在一般的工程中,這顯然不是我們所希望的。

正確的做法應(yīng)該是使用 super 來召喚父類的構(gòu)造函數(shù),而且 python 使用一種叫做方法解析順序的算法(具體實(shí)現(xiàn)算法叫做 C3),來保證一個(gè)類只會(huì)被初始化一次。

也就是說,能用 super,就用 super。

以上是Python 關(guān)於物件導(dǎo)向的六個(gè)問題的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

CSS下拉菜單示例 CSS下拉菜單示例 Jul 30, 2025 am 05:36 AM

是的,一個(gè)常見的CSS下拉菜單可以通過純HTML和CSS實(shí)現(xiàn),無需JavaScript。 1.使用嵌套的ul和li構(gòu)建菜單結(jié)構(gòu);2.通過:hover偽類控制下拉內(nèi)容的顯示與隱藏;3.父級(jí)li設(shè)置position:relative,子菜單使用position:absolute進(jìn)行定位;4.子菜單默認(rèn)display:none,懸停時(shí)變?yōu)閐isplay:block;5.可通過嵌套實(shí)現(xiàn)多級(jí)下拉,結(jié)合transition添加淡入動(dòng)畫,配合媒體查詢適配移動(dòng)端,整個(gè)方案簡(jiǎn)潔且無需JavaScript支持,適合大

什麼是加密貨幣中的統(tǒng)計(jì)套利?統(tǒng)計(jì)套利是如何運(yùn)作的? 什麼是加密貨幣中的統(tǒng)計(jì)套利?統(tǒng)計(jì)套利是如何運(yùn)作的? Jul 30, 2025 pm 09:12 PM

統(tǒng)計(jì)套利簡(jiǎn)介統(tǒng)計(jì)套利是一種基於數(shù)學(xué)模型在金融市場(chǎng)中捕捉價(jià)格錯(cuò)配的交易方式。其核心理念源於均值回歸,即資產(chǎn)價(jià)格在短期內(nèi)可能偏離長(zhǎng)期趨勢(shì),但最終會(huì)回歸其歷史平均水平。交易者利用統(tǒng)計(jì)方法分析資產(chǎn)之間的關(guān)聯(lián)性,尋找那些通常同步變動(dòng)的資產(chǎn)組合。當(dāng)這些資產(chǎn)的價(jià)格關(guān)係出現(xiàn)異常偏離時(shí),便產(chǎn)生套利機(jī)會(huì)。在加密貨幣市場(chǎng),統(tǒng)計(jì)套利尤為盛行,主要得益於市場(chǎng)本身的低效率與劇烈波動(dòng)。與傳統(tǒng)金融市場(chǎng)不同,加密貨幣全天候運(yùn)行,價(jià)格極易受到突發(fā)新聞、社交媒體情緒及技術(shù)升級(jí)的影響。這種持續(xù)的價(jià)格波動(dòng)頻繁製造出定價(jià)偏差,為套利者提供

Python Itertools組合示例 Python Itertools組合示例 Jul 31, 2025 am 09:53 AM

itertools.combinations用於生成從可迭代對(duì)像中選取指定數(shù)量元素的所有不重複組合(順序無關(guān)),其用法包括:1.從列表中選2個(gè)元素組合,如('A','B')、('A','C')等,避免重複順序;2.對(duì)字符串取3個(gè)字符組合,如"abc"、"abd",適用於子序列生成;3.求兩數(shù)之和等於目標(biāo)值的組合,如1 5=6,簡(jiǎn)化雙重循環(huán)邏輯;組合與排列的區(qū)別在於順序是否重要,combinations視AB與BA為相同,而permutations視為不同;

CSS全頁(yè)佈局示例 CSS全頁(yè)佈局示例 Jul 30, 2025 am 05:39 AM

使用Flexbox或Grid可實(shí)現(xiàn)全屏佈局,核心是讓頁(yè)面最小高度為視口高度(min-height:100vh);2.通過flex:1或grid-template-rows:auto1frauto使內(nèi)容區(qū)域佔(zhàn)滿剩餘空間;3.設(shè)置box-sizing:border-box確保內(nèi)邊距不超出容器;4.配合響應(yīng)式媒體查詢優(yōu)化移動(dòng)端體驗(yàn);該方案兼容性好且結(jié)構(gòu)清晰,適用於登錄頁(yè)、儀錶盤等場(chǎng)景,最終實(shí)現(xiàn)內(nèi)容垂直居中並佔(zhàn)滿視口的全屏頁(yè)面佈局。

Python Pytest夾具示例 Python Pytest夾具示例 Jul 31, 2025 am 09:35 AM

fixture是用於為測(cè)試提供預(yù)設(shè)環(huán)境或數(shù)據(jù)的函數(shù),1.使用@pytest.fixture裝飾器定義fixture;2.在測(cè)試函數(shù)中以參數(shù)形式註入fixture;3.yield之前執(zhí)行setup,之後執(zhí)行teardown;4.通過scope參數(shù)控製作用域,如function、module等;5.將共用fixture放在conftest.py中實(shí)現(xiàn)跨文件共享,從而提升測(cè)試的可維護(hù)性和復(fù)用性。

數(shù)據(jù)工程ETL的Python 數(shù)據(jù)工程ETL的Python Aug 02, 2025 am 08:48 AM

Python是實(shí)現(xiàn)ETL流程的高效工具,1.數(shù)據(jù)抽取:通過pandas、sqlalchemy、requests等庫(kù)可從數(shù)據(jù)庫(kù)、API、文件等來源提取數(shù)據(jù);2.數(shù)據(jù)轉(zhuǎn)換:使用pandas進(jìn)行清洗、類型轉(zhuǎn)換、關(guān)聯(lián)、聚合等操作,確保數(shù)據(jù)質(zhì)量並優(yōu)化性能;3.數(shù)據(jù)加載:利用pandas的to_sql方法或云平臺(tái)SDK將數(shù)據(jù)寫入目標(biāo)系統(tǒng),注意寫入方式與批次處理;4.工具推薦:Airflow、Dagster、Prefect用於流程調(diào)度與管理,結(jié)合日誌報(bào)警與虛擬環(huán)境提升穩(wěn)定性與可維護(hù)性。

Python類型提示功能示例 Python類型提示功能示例 Jul 31, 2025 am 04:19 AM

在Python中使用類型提示可提升代碼可讀性和可維護(hù)性,並支持靜態(tài)檢查。 1.基本類型提示如defgreet(name:str,age:int)->str:returnf"Hello,{name}.Youare{age}yearsold.";2.複雜類型需導(dǎo)入List、Dict、Optional,如List[Dict[str,Optional[int]]]表示字典列表,值可為int或None,返回Optional[str]表示可返回str或None;3.Union[int

See all articles