python面向對象基礎

python定義與創建類

Python 程序中類的使用順序是這樣的:
(1)創建(定義)類,也就是製作圖紙的過程;
(2)創建類的實例對象(根據圖紙造出實際的物品),通過實例對象實現特定的功能。

定義類:

基本語法格式

class 類名:
	類屬性……(>=0)
	類方法……(>=0)

在給類起名字時,最好使用能代表該類功能的單詞。如果由單詞構成類名,建議每個單詞的首字母大寫,其它字母小寫。

類屬性指的就是包含在類中的變量;而類方法指的是包含類中的函數。

根據定義屬性位置的不同,在各個類方法之外定義的變量稱爲類屬性或類變量,而在類方法中定義的屬性稱爲實例屬性(或實例變量)
示例:

class demo:
	'''這是一個示例'''  # 這是類的說明文檔
	#定義一個類屬性
	addr='https://blog.csdn.net/weixin_44225901'
	#定義一個方法
	def way(self,content):  # 和函數所有不同的是,類方法至少要包含一個 self 參數
		print(content)

還可以有空類:

class empty:
	pass

類的構造方法__init__()
每當創建一個類的實例對象時,python 解釋器都會自動的調用它。
語法格式

def __init__(self,...):
	代碼塊

需要注意的是,即便不手動爲類添加任何構造方法,Python 也會自動爲類添加一個僅包含 self 參數的構造方法,此時又稱爲類的默認構造方法。self 不需要手動傳遞參數。

python 類的實例化

語法格式

類名(參數)  # 定義類時,如果沒有手動添加 __init__() 構造方法,又或者添加的 __init__() 中僅有一個 self 參數,則創建類對象時的參數可以省略不寫。

實例化後的類對象可以執行以下操作:
(1)訪問或修改類對象具有的實例變量,甚至可以添加新的實例變量或者刪除已有的實例變量;
(2)調用類對象的方法,包括調用現有的方法,以及給類對象動態添加方法。

類對象訪問變量

類對象名.變量名

訪問方法

類對象名.方法名(參數)

類對象動態添加變量:直接增加一個新的實例變量併爲其賦值。
刪除變量:

del 實例變量

python self參數用法:
事實上,Python 只是規定,無論是構造方法還是實例方法,最少要包含一個參數,並沒有規定該參數的具體名稱。之所以將其命名爲 self,只是程序員之間約定俗成的一種習慣。

打個比方,如果把類比作造房子的圖紙,那麼類實例化後的對象是真正可以住的房子。根據一張圖紙(類),我們可以設計出成千上萬的房子(類對象),每個房子長相都是類似的(都有相同的類變量和類方法),但它們都有各自的主人,通過 self 參數,它就相當於每個房子的門鑰匙,可以保證每個房子的主人僅能進入自己的房子(每個類對象只能調用自己的類變量和類方法)。

# Python 類方法中的 self 參數就相當於 C++ 中的 this 指針。

self參數作用:當某個對象調用類方法時,Python 會自動綁定類方法的第一個參數指向調用該方法的對象。如此,Python解釋器就能知道到底要操作哪個對象的方法了。

無論是類中的構造函數還是普通的類方法,實際調用它們的誰,則第一個參數 self 就代表誰。

類對象動態添加方法

pass

python類中的變量與方法

在類體中,根據變量定義的位置不同,以及定義的方式不同,類屬性又可細分爲以下 3 種類型:
(1)類體中、所有函數之外:此範圍定義的變量,稱爲類屬性或類變量;
(2)類體中,所有函數內部:以“self.變量名”的方式定義的變量,稱爲實例屬性或實例變量;
(3)類體中,所有函數內部:以“變量名=變量值”的方式定義的變量,稱爲局部變量。

類變量和實例變量

類變量:
類變量的特點是,所有類的實例化對象都同時共享類變量,也就是說,類變量在所有實例化對象中是作爲公用資源存在的。類變量的調用方式有 2 種,既可以使用類名直接調用,也可以使用類的實例化對象調用。
通過類名不僅可以調用類變量,也可以修改它的值。
也可以使用類對象來調用所屬類中的類變量,但是不推薦,原因在於類中,實例變量和類變量可以同名,但這種情況下使用類對象將無法調用類變量,它會首選實例變量。
通過類名修改類變量,會作用到所有的實例化對象,因爲類變量爲所有實例對象所共有!

注意,通過類對象是無法修改類變量的。通過類對象對類變量賦值,其本質將不再是修改類變量的值,而是在給該對象定義新的實例變量。

實例變量:
實例變量指的是在任意類方法內部,以“self.變量名”的方式定義的變量,其特點是隻作用於調用方法的對象。另外,實例變量只能通過對象名訪問,無法通過類名訪問。
和類變量不同,通過某個對象修改實例變量的值,不會影響類的其它實例化對象,更不會影響同名的類變量。

局部變量:
局部變量直接以“變量名=值”的方式進行定義。
通常情況下,定義局部變量是爲了所在類方法功能的實現。需要注意的一點是,局部變量只能用於所在函數中,函數執行完成後,局部變量也會被銷燬。

類的實例方法、靜態方法和類方法

採用 @classmethod 修飾的方法爲類方法;採用 @staticmethod 修飾的方法爲靜態方法;不用任何修改的方法爲實例方法。

實例方法:
通常情況下,在類中定義的方法默認都是實例方法。不僅如此,類的構造方法理論上也屬於實例方法,只不過它比較特殊。
特點:最少也要包含一個 self 參數,用於綁定調用此方法的實例對象(Python 會自動完成綁定)。實例方法通常會用類對象直接調用。Python 也支持使用類名調用實例方法,但此方式需要手動給 self 參數傳值。

使用類對象調用實例方法不同,通過類名直接調用實例方法時,Python 並不會自動給 self 參數傳值。(是因爲self 參數需要的是方法的實際調用者(是類對象),而這裏只提供了類名,當然無法自動傳值。)

Python 中允許使用類名直接調用實例方法,但必須手動爲該方法的第一個 self 參數傳遞參數,這種調用方法的方式被稱爲“非綁定方法”。並且注意的是self傳的參數可以是任意的,這就有使程序崩潰的可能性!

用類的實例對象訪問類成員的方式稱爲綁定方法,而用類名調用類成員的方式稱爲非綁定方法。

類方法:
Python 類方法和實例方法相似,它最少也要包含一個參數,只不過類方法中通常將其命名爲 cls,Python 會自動將類本身綁定給 cls 參數(注意,綁定的不是類對象)。也就是說,我們在調用類方法時,無需顯式爲 cls 參數傳參。(即綁定之後就不需要傳參數了)

# 和 self 一樣,cls 參數的命名也不是規定的(可以隨意命名),只是 Python 程序員約定俗稱的習慣而已。

和實例方法最大的不同在於,類方法需要使用@classmethod修飾符進行修飾,即將@classmethod放到類方法的前面一行。
類方法推薦使用類名直接調用,當然也可以使用實例對象來調用(不推薦)。

類靜態方法

靜態方法,其實就是我們學過的函數,和函數唯一的區別是,靜態方法定義在類這個空間(類命名空間)中,而函數則定義在程序所在的空間(全局命名空間)中。
靜態方法需要使用@staticmethod修飾,即加在函數體前面。(與靜態變量略有不同)

靜態方法沒有類似 self、cls 這樣的特殊參數,因此 Python 解釋器不會對它包含的參數做任何類或對象的綁定。也正因爲如此,類的靜態方法中無法調用任何類屬性和類方法。

靜態方法的調用,既可以使用類名,也可以使用類對象。

在實際編程中,幾乎不會用到類方法和靜態方法,因爲我們完全可以使用函數代替它們實現想要的功能,但在一些特殊的場景中(例如工廠模式中),使用類方法和靜態方法也是很不錯的選擇。

# 當使用類對象調用類方法時,在傳參方面是和外界的函數有區別的,因爲 Python 會自動會第一個參數綁定方法的調用者,而位於全局空間中的函數,則必須顯式爲第一個參數傳遞參數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章