国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

Python 關於物件導向的六個問題

Apr 11, 2023 pm 08:43 PM
python 程式設計 對應

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

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

1. 什麼是類別和對象

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

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

再說說類,類別就是分類的類,代表一群有著相似性的事物的集合,對應 Python 關鍵字 class。

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

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

函數:物件的某個動態(tài)能力,例如你女朋友會唱歌、彈琴等。

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

類別是一群有著相同屬性和函數的對象的集合。

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

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

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

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

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

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

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

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

object._ClassName__PrivateMember

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

看註解吧:

class Document():

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

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

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

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

# 靜態(tài)函數
@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'))

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

  • 當我們需要再次呼叫建構函式時,也就是建立新的實例物件時
  • 需要不修改現有實例的情況下傳回一個新的實例。

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

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

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

兩種方法,推薦第二種。

第一種:

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. 有下列繼承關係: A,B(A),C(A),D(B ,C) 那麼D 在初始化的時候,A,B,C 的初始化順序是怎麼樣的?A 是否會初始化兩次?

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

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

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

第一種:

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

第二個:

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

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

正確的做法應該是使用 super 來召喚父類的構造函數,而且 python 使用一種叫做方法解析順序的算法(具體實現算法叫做 C3),來保證一個類只會被初始化一次。

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

以上是Python 關於物件導向的六個問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1601
29
PHP教程
1502
276
VSCODE設置。 JSON位置 VSCODE設置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級或工作區(qū)級路徑,用於自定義VSCode設置。 1.用戶級路徑: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ū)級路徑:項目根目錄下的.vscode/settings

數據工程ETL的Python 數據工程ETL的Python Aug 02, 2025 am 08:48 AM

Python是實現ETL流程的高效工具,1.數據抽?。和ㄟ^pandas、sqlalchemy、requests等庫可從數據庫、API、文件等來源提取數據;2.數據轉換:使用pandas進行清洗、類型轉換、關聯、聚合等操作,確保數據質量並優(yōu)化性能;3.數據加載:利用pandas的to_sql方法或云平臺SDK將數據寫入目標系統,注意寫入方式與批次處理;4.工具推薦:Airflow、Dagster、Prefect用於流程調度與管理,結合日誌報警與虛擬環(huán)境提升穩(wěn)定性與可維護性。

python shutil rmtree示例 python shutil rmtree示例 Aug 01, 2025 am 05:47 AM

shutil.rmtree()是Python中用於遞歸刪除整個目錄樹的函數,能刪除指定文件夾及其所有內容。 1.基本用法:使用shutil.rmtree(path)刪除目錄,需處理FileNotFoundError、PermissionError等異常。 2.實際應用:可一鍵清除包含子目錄和文件的文件夾,如臨時數據或緩存目錄。 3.注意事項:刪除操作不可恢復;路徑不存在時拋出FileNotFoundError;可能因權限或文件佔用導致失敗。 4.可選參數:可通過ignore_errors=True忽略錯

如何在Python中執(zhí)行SQL查詢? 如何在Python中執(zhí)行SQL查詢? Aug 02, 2025 am 01:56 AM

安裝對應數據庫驅動;2.使用connect()連接數據庫;3.創(chuàng)建cursor對象;4.用execute()或executemany()執(zhí)行SQL並用參數化查詢防注入;5.用fetchall()等獲取結果;6.修改後需commit();7.最後關閉連接或使用上下文管理器自動處理;完整流程確保安全且高效執(zhí)行SQL操作。

Google Chrome無法打開本地文件 Google Chrome無法打開本地文件 Aug 01, 2025 am 05:24 AM

ChromecanopenlocalfileslikeHTMLandPDFsbyusing"Openfile"ordraggingthemintothebrowser;ensuretheaddressstartswithfile:///;2.SecurityrestrictionsblockAJAX,localStorage,andcross-folderaccessonfile://;usealocalserverlikepython-mhttp.server8000tor

如何在Python中的多個過程之間共享數據? 如何在Python中的多個過程之間共享數據? Aug 02, 2025 pm 01:15 PM

使用multiprocessing.Queue可在多個進程間安全傳遞數據,適合多生產者和消費者的場景;2.使用multiprocessing.Pipe可實現兩個進程間的雙向高速通信,但僅限兩點連接;3.使用Value和Array可在共享內存中存儲簡單數據類型,需配合Lock避免競爭條件;4.使用Manager可共享複雜數據結構如列表和字典,靈活性高但性能較低,適用於復雜共享狀態(tài)的場景;應根據數據大小、性能需求和復雜度選擇合適方法,Queue和Manager最適合初學者使用。

Python Boto3 S3上傳示例 Python Boto3 S3上傳示例 Aug 02, 2025 pm 01:08 PM

使用boto3上傳文件到S3需先安裝boto3並配置AWS憑證;2.通過boto3.client('s3')創(chuàng)建客戶端並調用upload_file()方法上傳本地文件;3.可指定s3_key作為目標路徑,若未指定則使用本地文件名;4.應處理FileNotFoundError、NoCredentialsError和ClientError等異常;5.可通過ExtraArgs參數設置ACL、ContentType、StorageClass和Metadata;6.對於內存數據,可使用BytesIO創(chuàng)建字

了解網絡端口和防火牆 了解網絡端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

See all articles