Python的面向對象常見概念解析
【常見概念簡介】
- 類(class)—— 用來描述某些具有相同屬性和方法的對象的集合。格式如下
class test(): class_variable ...
def f(self,*arg,**args): statement ... - 類方法 ———— 類中定義的函數(跟普通函數的唯一區別就是:類方法的第一個參數必須是實例/對象自己,習慣上常用self表示(當然,如果你看不順眼也可以使用其他字符串代替,使用self只是pythonic的習慣而已)。見上方示例)
- 類變量 ———— 定義在類中、類方法外,在該類的所有實例間共享。一般情況下建議使用「class.variable」形式訪問。
- 實例變量 ——— 定義在類方法中,且以「self.variable」形式出現。各實例間獨享、互不影響。
- 繼承 ————— 一個派生類繼承基類的變量和方法,基類可以是單個類也可以有多個類(多個類繼承時,按照繼承順序從左到右繼承(多個類有相同的變量/方法時以左側最先匹配到的父類為準))
- 重載 ————— 又叫「方法重寫」:當繼承的父類的方法不能完全滿足子類需要的時候,一般會在子類中重新定義一個同名方法。
【典型問題剖析】
類變量 vs 實例變量:
''' 從代碼的可讀性、可維護性、易理解等角度出發,建議: 類變量————使用「Class.Variable」形式讀取、修改 實例變量————使用「instance.Variable」形式讀取、修改 否則,代碼結構不易維護、執行結果不易理解 '''
1)按上述建議訪問類變量,代碼邏輯清晰、執行結果一目了然:
代碼:
class Person: name = 'Hello ' print(name,'\t'*2,id(name)) def changeName(self): Person.name += 'Python' #按照建議的規範訪問並修改類變量,結果:二種方式讀取到的內容一致,沒有歧義 print(self.name,'\t',id(self.name)) print(Person.name,'\t',id(Person.name)) p = Person() p.changeName()
執行結果:
Hello 1695645322992 Hello Python 1695645419888 Hello Python 1695645419888 Process finished with exit code 0
2)不遵守上述規範,代碼不一定會報錯,但執行結果不可控,不利於代碼的維護和邏輯理解:
代碼:
class Person: name = 'Hello ' print(name,'\t'*2,id(name)) def changeName(self): self.name += 'Python' #不按照建議的規範訪問並修改類變量,結果:二種方式讀取到的內容一致,沒有歧義 print(self.name,'\t',id(self.name)) print(Person.name,'\t',id(Person.name)) p = Person() p.changeName()
執行結果:
Hello 2145404866288 Hello Python 2145404963184 Hello 2145404866288 Process finished with exit code 0