學(xué)python必須掌握面向對象編程。類是創(chuàng)建對象的模板,對象是類的具體實(shí)例,通過class定義類,使用__init__初始化對象屬性,并可定義方法如say_hello。類的三大特性為:1.封裝:將數(shù)據(jù)與操作包裝在一起,隱藏實(shí)現(xiàn)細(xì)節(jié);2.繼承:子類繼承父類的屬性和方法,減少重復(fù)代碼;3.多態(tài):不同類對同一方法有不同實(shí)現(xiàn)。變量分為實(shí)例變量(每個對象獨(dú)有)和類變量(所有實(shí)例共享)。方法分為:實(shí)例方法(操作實(shí)例數(shù)據(jù))、類方法(@classmethod,處理類級別邏輯)、靜態(tài)方法(@staticmethod,通用工具函數(shù))。合理運(yùn)用這些概念能提升代碼結(jié)構(gòu)與質(zhì)量。
學(xué)python,繞不開面向?qū)ο?/b>編程。類和對象是其中的核心概念,理解它們,才能寫出結(jié)構(gòu)清晰、易于維護(hù)的代碼。
什么是類與對象?
簡單來說,類是一個模板,對象是根據(jù)這個模板創(chuàng)建出來的具體實(shí)例。比如你可以定義一個Person類,它描述了“人”應(yīng)該有哪些屬性(如姓名、年齡)和行為(如說話、走路),然后根據(jù)這個類創(chuàng)建出不同的“人”的對象。
舉個例子:
立即學(xué)習(xí)“Python免費(fèi)學(xué)習(xí)筆記(深入)”;
class Person: def __init__(self, name, age): self.name = name self.age = age def say_hello(self): print(f"你好,我是{self.name}")
上面這段代碼定義了一個Person類,里面有初始化方法和一個打招呼的方法。之后你就可以用它來創(chuàng)建具體的對象,比如:
p1 = Person("小明", 25) p1.say_hello()
類的三大特性:封裝、繼承、多態(tài)
-
封裝:把數(shù)據(jù)和操作這些數(shù)據(jù)的方法包裝在一起,對外隱藏實(shí)現(xiàn)細(xì)節(jié),只暴露接口。這樣可以提高安全性,也方便管理。
-
繼承:子類可以從父類那里“繼承”屬性和方法,避免重復(fù)寫代碼。比如你可以有一個Student類繼承自Person,自動擁有名字和年齡,并添加自己的屬性如學(xué)號。
-
多態(tài):不同類的對象對同一方法有不同的實(shí)現(xiàn)方式。比如兩個類都實(shí)現(xiàn)了draw()方法,但一個畫圓,一個畫方,調(diào)用時會根據(jù)對象類型自動選擇對應(yīng)的方法。
這三點(diǎn)是面向?qū)ο缶幊痰暮诵乃枷耄莆樟怂鼈儯湍芨玫亟M織復(fù)雜程序的結(jié)構(gòu)。
實(shí)例變量 vs 類變量
在類中,變量分為兩種:實(shí)例變量和類變量。
- 實(shí)例變量屬于每個對象自己,不同對象之間互不影響。
- 類變量屬于類本身,所有實(shí)例共享同一個類變量。
看個例子你就明白了:
class Dog: species = "犬科動物" # 類變量 def __init__(self, name): self.name = name # 實(shí)例變量 d1 = Dog("旺財(cái)") d2 = Dog("小白") print(d1.species) # 輸出 犬科動物 print(d2.species) # 輸出 犬科動物
如果你修改了類變量,所有實(shí)例都會受到影響:
Dog.species = "寵物狗" print(d1.species) # 輸出 寵物狗 print(d2.species) # 輸出 寵物狗
這點(diǎn)要特別注意,別不小心改了類變量影響到所有實(shí)例。
靜態(tài)方法 vs 類方法 vs 實(shí)例方法
Python中有三種常見方法類型:
- 實(shí)例方法:最常用的一種,第一個參數(shù)是self,代表當(dāng)前實(shí)例。
- 類方法:使用@classmethod裝飾器,第一個參數(shù)是cls,代表類本身。
- 靜態(tài)方法:使用@staticmethod裝飾器,不接收self或cls參數(shù),更像是普通函數(shù),但放在類里更合適。
什么時候用哪種?可以這么記:
- 操作實(shí)例數(shù)據(jù) → 用實(shí)例方法
- 修改類變量或做類級別的處理 → 用類方法
- 工具性方法,不需要訪問類或?qū)嵗?→ 用靜態(tài)方法
比如:
class MathUtils: @staticmethod def add(a, b): return a + b @classmethod def log_add(cls, a, b): result = cls.add(a, b) print(f"結(jié)果是{result}") return result
基本上就這些了。
類和對象的概念看起來不難,但真正掌握需要多練多用。特別是在項(xiàng)目結(jié)構(gòu)設(shè)計(jì)上,合理使用繼承和封裝能大大提升代碼質(zhì)量。