搜尋
首頁後端開發Python教學Python 關於物件導向的六個問題

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

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

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

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

1. 什麼是類別和對象

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

object._ClassName__PrivateMember

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

看註解吧:

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)

# 静态函数
@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。

靜態函數,以@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中文網其他相關文章!

陳述
本文轉載於:51CTO.COM。如有侵權,請聯絡admin@php.cn刪除
Python的科學計算中如何使用陣列?Python的科學計算中如何使用陣列?Apr 25, 2025 am 12:28 AM

Arraysinpython,尤其是Vianumpy,ArecrucialInsCientificComputingfortheireftheireffertheireffertheirefferthe.1)Heasuedfornumerericalicerationalation,dataAnalysis和Machinelearning.2)Numpy'Simpy'Simpy'simplementIncressionSressirestrionsfasteroperoperoperationspasterationspasterationspasterationspasterationspasterationsthanpythonlists.3)inthanypythonlists.3)andAreseNableAblequick

您如何處理同一系統上的不同Python版本?您如何處理同一系統上的不同Python版本?Apr 25, 2025 am 12:24 AM

你可以通過使用pyenv、venv和Anaconda來管理不同的Python版本。 1)使用pyenv管理多個Python版本:安裝pyenv,設置全局和本地版本。 2)使用venv創建虛擬環境以隔離項目依賴。 3)使用Anaconda管理數據科學項目中的Python版本。 4)保留系統Python用於系統級任務。通過這些工具和策略,你可以有效地管理不同版本的Python,確保項目順利運行。

與標準Python陣列相比,使用Numpy數組的一些優點是什麼?與標準Python陣列相比,使用Numpy數組的一些優點是什麼?Apr 25, 2025 am 12:21 AM

numpyarrayshaveseveraladagesoverandastardandpythonarrays:1)基於基於duetoc的iMplation,2)2)他們的aremoremoremorymorymoremorymoremorymoremorymoremoremory,尤其是WithlargedAtasets和3)效率化,效率化,矢量化函數函數函數函數構成和穩定性構成和穩定性的操作,製造

陣列的同質性質如何影響性能?陣列的同質性質如何影響性能?Apr 25, 2025 am 12:13 AM

數組的同質性對性能的影響是雙重的:1)同質性允許編譯器優化內存訪問,提高性能;2)但限制了類型多樣性,可能導致效率低下。總之,選擇合適的數據結構至關重要。

編寫可執行python腳本的最佳實踐是什麼?編寫可執行python腳本的最佳實踐是什麼?Apr 25, 2025 am 12:11 AM

到CraftCraftExecutablePythcripts,lollow TheSebestPractices:1)Addashebangline(#!/usr/usr/bin/envpython3)tomakethescriptexecutable.2)setpermissionswithchmodwithchmod xyour_script.3)

Numpy數組與使用數組模塊創建的數組有何不同?Numpy數組與使用數組模塊創建的數組有何不同?Apr 24, 2025 pm 03:53 PM

numpyArraysareAreBetterFornumericalialoperations andmulti-demensionaldata,而learthearrayModuleSutableforbasic,內存效率段

Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Apr 24, 2025 pm 03:49 PM

numpyArraySareAreBetterForHeAvyNumericalComputing,而lelethearRayModulesiutable-usemoblemory-connerage-inderabledsswithSimpleDatateTypes.1)NumpyArsofferVerverVerverVerverVersAtility andPerformanceForlargedForlargedAtatasetSetsAtsAndAtasEndCompleXoper.2)

CTYPES模塊與Python中的數組有何關係?CTYPES模塊與Python中的數組有何關係?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingingangandmanipulatingc-stylarraysinpython.1)usectypestoInterfacewithClibrariesForperfermance.2)createc-stylec-stylec-stylarraysfornumericalcomputations.3)passarraystocfunctions foreforfunctionsforeffortions.however.however,However,HoweverofiousofmemoryManageManiverage,Pressiveo,Pressivero

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器