前言:本文主要介紹python面對對象中的類和繼承,包括類方法、靜態方法、只讀屬性、繼承等。python
使用裝飾器@classmethod裝飾,且第一個參數必須是當前類對象,該參數名通常約定爲「cls",經過它來傳遞類的屬性和方法編程
(不能傳遞實例屬性和實例方法),跟實例方法的self用法類似。測試
實例對象和類對象均可以調用spa
在須要站在類的角度執行某個行爲時,那麼就能夠定義爲類方法code
class Student: def __init__(self, name, age): self.name = name self.age = age def student_info(self): """實例方法""" print("-----student_info-----") print('name:{}'.format(self.name)) print('age:{}'.format(self.age)) @classmethod # 帶有@classmethod標誌的就是類方法,@xxx 就是裝飾器 def class_info(cls): # cls與self的用法一致,self表明的是實例對象自己,cls表明的是類自己 """類方法""" # 應用場景:須要站在類的角度執行某個行爲時,就定義爲類方法 print("-----class_info-----") print('在校學生') print("cls:", cls) case = Student('張三', 22) case.student_info() case.class_info() # 經過實例對象訪問類方法 Student.class_info() # 經過類對象訪問類方法
運行結果:orm
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py -----student_info----- name:張三 age:22 -----class_info----- 在校學生 cls: <class '__main__.Student'> -----class_info----- 在校學生 cls: <class '__main__.Student'> Process finished with exit code 0
(瞭解便可,在自動化測試中暫時用不到)對象
使用裝飾器@staticmethod裝飾,參數隨意,不須要「self「和「cls"參數,可是方法體中不能使用類或實例的任何屬性和方法blog
實例對象和類對象均可以調用繼承
用於存放純邏輯代碼,內部不須要引用類或實例的屬性和方法遊戲
class Student: def __init__(self, name, age): self.name = name self.age = age def student_info(self): """實例方法""" print("-----student_info-----") print('name:{}'.format(self.name)) print('age:{}'.format(self.age)) @staticmethod # 靜態方法不會牽涉到類和實例,裏面只存放邏輯代碼 def static_move(): # 類和實例均可以調用靜態方法 """靜態方法""" print("-----static_info-----") print('清華大學的學生') case = Student('張三', 22) case.student_info() case.static_move() # 經過實例對象訪問靜態方法 Student.static_move() # 經過類對象訪問靜態方法
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py -----student_info----- name:張三 age:22 -----static_info----- 清華大學的學生 -----static_info----- 清華大學的學生 Process finished with exit code 0
(瞭解便可,在自動化測試中暫時用不到)
使用裝飾器@property裝飾,須要一個self參數,即實例對象自己,用於定義一個屬性(通常指實例屬性),只能讀,不能寫入
經過實例對象去調用
屬性只能讀,不能夠寫入或更改
class Student: def __init__(self, name, age): self.name = name self.age = age def student_info(self): """實例方法""" print("-----student_info-----") print('name:{}'.format(self.name)) print('age:{}'.format(self.age)) @property def property(self): # 定義一個只能用,不能改的屬性,瞭解便可 """只讀屬性""" print("-----property_info-----") return 18 case = Student('張三', 22) case.student_info() print(case.property) # 經過實例對象訪問只讀屬性
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py -----student_info----- name:張三 age:22 -----property_info----- 18 Process finished with exit code 0
在上一章的隨筆中也提到過,在python3中,全部的類都默認繼承自object這個父類(基礎類)。那麼什麼是繼承?繼承的做用是什麼呢?
定義:面對對象編程中有一個很重要的思想叫繼承,子類能夠經過繼承得到父類的屬性和方法,被繼承的類叫父類(基類),
繼承的類叫子類
子類的實例對象能訪問全部父類的實例方法,無論往上有幾層父類均可以訪問,但不能往下訪問本身的子類
class BasePhone(object): """定義一個手機基礎類""" def __init__(self, brand, model, price): self.brand = brand self.model = model self.price = price def phone_func(self): """手機功能""" print("這款手機是觸屏手機") print("這款手機是智能手機") print("這款手機有紅外線功能") print("這款手機有nfc功能") class HonorPhone(BasePhone): """繼承手機基礎類,這是榮耀系列手機,基礎功能都有""" def phone_info(self): print("您的手機品牌是{},型號{},價格{}".format(self.brand,self.model,self.price)) def honor_func(self): """榮耀功能""" print("這款手機支持HiFi") print("這款手機能夠玩mobile遊戲") print("這款手機支持應用分屏") class HonorPorPhone(HonorPhone): """繼承手機基礎類,這是榮耀pro系列手機,基礎功能和榮耀功能都有""" def new_func(self): """新功能""" print("這款手機支持30倍變焦") # 實例化對象,繼承後有最上層父類的初始化方法,須要傳三個參數 phone1 = HonorPorPhone('榮耀手機', 'Honor20pro', '¥3599') phone1.phone_info() phone1.phone_func() # 調用最上層父類的方法(子類建立出來的對象能訪問全部父類的實例方法) phone1.honor_func() # 調用父類的方法 phone1.new_func() # 調用本身的方法 phone2 = HonorPhone('榮耀手機', 'Honor20', '¥2999') # 做爲HonorPorPhone類的父類,建立出來的對象不能訪問子類(即HonorPorPhone類)的實例方法,不能往下訪問 phone2.new_func() # 所以這裏運行會報錯
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py 您的手機品牌是榮耀手機,型號Honor20pro,價格¥3599 這款手機是觸屏手機 這款手機是智能手機 這款手機有紅外線功能 這款手機有nfc功能 這款手機支持HiFi 這款手機能夠玩mobile遊戲 這款手機支持應用分屏 這款手機支持30倍變焦 Traceback (most recent call last): File "D:/learn/python18_http_request/exercise/test.py", line 62, in <module> phone2.new_func() AttributeError: 'HonorPhone' object has no attribute 'new_func' Process finished with exit code 1
調用父類的屬性也是如此,這裏就再也不舉例了。
子類不只僅能夠調用父類的方法,也能夠重寫父類的方法再從新調用,簡單來講在子類中寫一個與父類同名的方法,而且也沿用父類方法裏的代碼,
只是在父類方法基礎上再增長一些代碼,子類重寫了父類的方法後,再調用父類方法的方式有兩種:
方式二:
# -*- coding:utf8 -*- """ ================================= Time : 2019/10/8 21:04 Author : miki_peng Email : 307325534@qq.com File : day12_class_object.py ================================== """ # 繼承:在python3的繼承中,全部的類都默認繼承自object這個父類(基礎類) # 兩種寫法都默認繼承object類 # class Phone: # pass # # class BasePhone(object): # pass class BasePhone(object): """定義一個手機基礎類""" def __init__(self, brand, model, price): self.brand = brand self.model = model self.price = price def phone_func(self): """手機功能""" print("這款手機是觸屏手機") print("這款手機是智能手機") print("這款手機有紅外線功能") print("這款手機有nfc功能") class HonorPhone(BasePhone): """繼承手機基礎類,這是榮耀系列手機,基礎功能都有""" def phone_info(self): print("您的手機品牌是{},型號{},價格{}".format(self.brand,self.model,self.price)) def phone_func(self): """重寫父類的手機功能方法,在這基礎上增長一個功能""" print("這款手機有雙攝像頭") # BasePhone.phone_func(self) # 重寫父類同名方法後,再調用父類的方法 第一種方式 super().phone_func() # 重寫父類同名方法後,再調用父類的方法 第二種方式(經常使用) def honor_func(self): """榮耀功能""" print("這款手機支持HiFi") print("這款手機能夠玩mobile遊戲") print("這款手機支持應用分屏") class BetaPhone(BasePhone): # 這個類沒有重寫父類的手機功能方法 """繼承手機基礎類,這是Beta系列手機,有基礎功能""" def phone_info(self): print("您的手機品牌是{},型號{},價格{}".format(self.brand,self.model,self.price)) def new_func(self): """新功能""" print("這款手機支持30倍變焦") # 實例化對象,繼承後有最上層父類的初始化方法,須要傳三個參數 phone1 = HonorPhone('榮耀手機', 'Honor20', '¥2999') phone1.phone_info() phone1.phone_func() # 調用父類的方法 phone1.honor_func() # 調用本身的方法 print("-------------分割線------------") phone2 = BetaPhone('Beta手機', 'Beta8', '¥3299') phone2.phone_info() phone2.phone_func() phone2.new_func()
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py 您的手機品牌是榮耀手機,型號Honor20,價格¥2999 這款手機有雙攝像頭 這款手機是觸屏手機 這款手機是智能手機 這款手機有紅外線功能 這款手機有nfc功能 這款手機支持HiFi 這款手機能夠玩mobile遊戲 這款手機支持應用分屏 -------------分割線------------ 您的手機品牌是Beta手機,型號Beta8,價格¥3299 這款手機是觸屏手機 這款手機是智能手機 這款手機有紅外線功能 這款手機有nfc功能 這款手機支持30倍變焦 Process finished with exit code 0
重寫父類方法後也能夠再也不調用父類方法,至關於把重名的方法從新寫一遍,若是以爲理解不了,本身多敲幾遍,觸類旁通練習一下吧!
做者:miki_peng
出處:https://www.cnblogs.com/miki-peng