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