-
Python類的使用
Python 是面向對象的編程語言, 對象不是我們常說的男女對象, 而是編程是為實現某些功能或解決某些問題, 在實現的過程中, 需要將實現過程具體化。 好比現實中某些例子, 如超市購物, 在超市購物的時候, 購買者挑選自己所需的物品並完成支付, 這是一個完整的購物過程。 在這個過程中, 購買者的動作, 如挑選自己物品, 走到收銀台完成支付。
如果使用編程的語言解釋這個購物過程, 這個購買過程好比主程序, 購買者可被比喻成一個對象, 購買者的手和腳就是對象的屬性或方法。 購買的過程由購買者的手和腳完成, 相當於主程序的代碼是由對象的屬性或方法來實現。
類是對象的一個具體描述, 對象的屬性和方法都是由類進行定義和設置的。 類主要分為屬性和方法, 屬性就好比人的姓名、 性別和學歷等, 用於對人的描述: 方法就如人的四肢和五宮, 可以實現某些簡單的操作。 完整的類定義的語法如下:
class Person(object): name = '小黃' def __init__(self): self.age = '18' def foot(self): print('普通方法') @classmethod def class_hand(cls): print('類方法') @staticmethod def static_mouth(): print('靜態方法') if __name__ == '__main__': print('靜態屬性:',Person.name) person = Person() print('靜態屬性:',person.name) person = Person() print('動態屬性:',person.age) person = Person() person.foot() Person.class_hand() person = Person() person.class_hand() Person.static_mouth() person = Person() person.static_mouth()
類的定義由關鍵詞 class 實現, 關鍵詞 class后面為類名, 這個可以自定義命名;類名后面是一個小括號和object類,這是 Python 的新式類。 Python 的類分為新式類和經典類, 經典類在日常開發中不建議使用, 現在都是使用新式類進行定義。 有關 Python 的新式類和經典類此處不做詳細講述, 有興趣的讀者可以自行研究。
在上述類的定義語法中,Person 類定義了類的屬性和方法, 類屬性又分為靜態屬性和動態屬性;類的方法分為普通方法、類方法和靜態方法。靜態屬性和動態屬性的最大區別在於使用方式的不同,前者具備兩種使用方式,后者需要將類實例化后才能使用。普通方法、類方法和靜態方法也是如此,前者只能實例化后才能使用,后兩者具備兩種使用方式。
在類定義中,我們留意到關鍵詞 self,這個關鍵字代表類本身,這也說明帶有 self的變量或方法是當前類所定義的動態屬性或方法。代碼運行結果如圖所示。
在定義類的時候,類會自動生成許多內置方法。 如代碼中的 _init_ 初始化方法,類在實例化的時候, 首先自動執行 _init_ 初始化方法。 上述的Person類是自定義類的初始化方法, 如果在定義類的時候,沒有特殊要求,可以不用重寫初始化方法。如果在初始化方法里面設置類的參數,在調用類的時候, 類的實例化也應設置相應的參數。 具體的使用方式如下述代碼所示:
class Person(object): def __init__(self, name): self.name = name if __name__ == '__main__': person = Person('小黃') print(person.name)
上述代碼演示了__int__初始化方法的使用方式,在實際的開發中,是否重寫初始化方法應根據功能實現方式決定。此外,類還具有以下的常用的內置方法,如下表
類的使用在上述例子中有所提及,在調用類的屬性和方法之前,建議將類實例化后在使用。類的實例化也稱為對象,類在實例化之后,可以直接調用類的屬性或方法來實現某些功能或者操作,這就是面向對象的編程思想。
-
類的封裝
封裝在我們日常生活中都能看到和接觸到, 比如在使用支付寶進行付款的時候, 只需要把二維碼給收款方或掃下收款方提供的二維碼就可以完成支付, 無需知道程序如何解析二維碼以及資金的交易流向, 其整個支付功能就可以理解為是經過封裝處理。 從這個例子得知, 封裝是將程序中某些功能的執行過程寫到函數或類里面, 當程序調用函數或類時即可實現程序的功能。
Python 的類可以分成兩層封裝, 類在實例化時所生成的對象看作一個己經封裝好的對象,調用對象的屬性或方法來實現某些功能, 這是類的第一層封裝。有時候需要把類里面的某些屬性或方法封裝起來, 將其設置為類的私有屬性或方法, 使得這些屬性和方法只能 在類的內部使用, 無法在類的外部調用, 這是類的第二層封裝。
對於類的第一層封裝, 相信讀者在上節中有所了解,本節就不再講述。 類的第二層封裝主要是將類的屬性或方法設置為私有,只允許在類的內部使用。 定義私有屬性或方法只需要在屬性名和方法名之前加雙下划線即可, 具體的代碼如下:
class Person(object): def __init__(self, name): self.__name = name self.age = 10 def __get_age(self): return self.age def get_name(self): return self.__name if __name__ == '__main__': p = Person('Lili') print('公有屬性age的屬性值:', p.age) print('公有方法get_name的返回值:', p.get_name()) print('強制讀取私有屬性,屬性值:', p.Person__name) print('強制調用私有方法,返回值:', p._Person__get_age())
上述代碼分別定義私有屬性_name、公有屬性 age、私有方法_get_age 和普通方法 get_name。在主程序中,將類實例化生成對象 p,然后對象 p 只能獲取公有屬性age的屬性值和調用公有方法 get_name,如果對象 p i周用私有屬性_nam和私有方法_get_age,程序會提示 AttributeError: 'Person' object has no attribute '_name,等錯誤信息。但這並不代表無法 在類的外部讀取私有屬性和調用私有方法, 可以使用強制性的方式來獲取私有屬性和調用私有方法, 如 p._Person_ name 或 p._Person_get_age(), 但在日常開發中,則不提倡這種強制性的操作方式。 代碼運行結果如圖所示
-
類的繼承
繼承常用於父母與子女之間, 比如子女的外貌長得像父母, 這是因為子女的基因是來 自於父母。 編程語言中的繼承也是如此, 比如在定義 Student 類的時候, 可以使 Student 類繼承 Person 類, 使得子類 Student 擁有父類 Person 的所有屬性和方法, 而且子類 Student可重寫父類的屬性和方法或自定義新的屬性和方法。 下面通過示例來說明類的繼承:
class Person(object): def __init__(self, name): self.__name = name self.age = 10 def __get_age(self): return self.age def get_name(self): return self.__name class Student(Person): def student_name(self): return self._Person__name if __name__ == "__main__": s = Student('Lucy') print('調用父類的普通方法:', s.get_name()) print('調用父類的私有方法:', s._Person__get_age()) print('這是Student類的名字:', s.student_name())
從子類 Student 的定義來看, 類名 Student 后面的小括號里 Person 是指向父類 Person, 這是將 Student 類繼承 Person 類, 如果 Student 類需要繼承多個類, 可以在小括號里填寫,每個類之間使用英文格式的逗號隔開。 在子類 Student 里面, 只是定義了普通方法歸student_name,由於它的父類是Person,因此它還具有父類的屬性_name 和 age、父類的方法_get_age和get_name。
在主程序中, 子類 Student 首先實例化生成對象 s,在實例化時需要設置參數, 因為子 類 Student 繼承了父類 Person 的初始化方法 _init_ 。對象 s可以調用 Student 所有的屬性和方法, 對於父類的私有屬性和私有方法可以使用強制性的操作方式來實現。 代碼運行結果如圖所示。