Python中類的聲明,使用,屬性,實例屬性,計算屬性及繼承,重寫 ...
Python中的類的定義以及使用:
類的定義:
定義類 在Python中,類的定義使用class關鍵字來實現 語法如下: class className: "類的註釋" 類的實體 (當沒有實體時 使用pass代替)
下麵定義一個鳥類;
class flyBord: """鳥類""" pass #這裡我們並沒有實體所以我們使用pass代替
這就是一個類的最基本的定義
類中的__init__函數:類似於java中的構造函數,以及類的使用
實例如下:
#eg:定義一個狗類 class Dog: def __init__(self): #方法名為 __init__ 形參必須要帶一個self 當然也可以別名 self習慣使然 print("我是一隻小狗") #創建一個實例 dog_1 = Dog() #創建類的實例,也就是調用這個類
註意這裡的方法__intit__(self)下劃線是前面兩個下劃線,後面兩個下劃線,並不是一個下劃線。
輸出結果如下:
我是一隻小狗
當一個類的實例被創建出來的時候__init__(self)方法就會被自動調用,類似於java,C#中的構造函數。
類中的類屬性與實例屬性:
實例如下:
#eg:定義一個貓類 class cat: """貓類""" name = "小花" #類屬性 可以通過類來調用 # __init__為實例方法 def __init__(self): #self為實例參數 self.name_1 = "小強" #實例屬性 定義時必須要用實例參數.出來
那麼接下來我們分別調用它的類屬性,實例屬性
#cat_1為實例名稱 cat_1 = cat()
print(cat.name) #調用它的類屬性
print(cat_1.name) #通過實例參數調用類屬性
print(cat_1.name_1) #調用實例屬性
接下來我們看一下輸出結果:
小花
小花
小強
可以根據調用時使用的屬性以及輸出結果看到:
通過類名只可以調用類屬性
通過實例名稱可以調用類屬性也可以調用實例屬性
計算屬性
在Python中,可以通過@property(裝飾器)將一個方法轉換為屬性,從而實現用於計算的屬性。
將方法轉換為屬性後,可以直接通過方法名來訪問方法,而不需要再添加一對小括弧"()",這樣可以讓代碼更加簡潔
#通過@property創建用於計算的屬性的語法格式如下: #eg: """ @property @property 裝飾器 def methodname(self): methodname:用於指定方法名,一般使用小寫字母開頭。該名稱最後將作為創建的屬性。 self:必要參數 block block:方法體,實現具體的功能,可以通過pass代替 """
下麵定義一個類來具體實現矩形面積的求法:
#eg: class Rect: def __init__(self,height,width): self.height = height self.width = width @property def arae(self): return self.height*self.width
創建這個類的實例並且調用已經被寫成計算屬性的方法arae:
temp = Rect(800,600) print(temp.arae)
輸出結果如下:
480000
可以看到我們在通過temp實例調用方法arae()時並沒有帶小括弧(),因為arae()方法已經被我們寫成了計算屬性
繼承的定義:
在編寫類的時候,並不是每一次都要從空白開始編寫,當要編寫的類和另外一個已經存在的類存在一定的繼承關係時,就可以通過繼承來達到代碼的重用的目的,提高開發效率。就如同在自然現象中的我們每個人都從父輩祖輩哪裡繼承了很多的特征,但又不完全是他們,我們又有自己的一些特征,在編程中被繼承的類叫做父類或基類,新的類叫做基類或者派生類。
繼承的語法:
"""
class ClassName(baseclasslist): #ClassName派生類的類名 baseclasslist:被繼承的父類;被繼承的父類可以有多個
'''類的幫助文檔''' 幫助文檔 可以在創建對象的時候輸入類名和'('時可以查看
statement 類體 可以使用pass替代
"""
下麵定義兩個父類在(父類中創建一個實例函數)和一個子類 子類繼承父類:
class father: def __init__(self): print("我是父親") class mather: def __init__(self): print("我是母親") class son(father,mather): pass
創建子類son的實例,並查看輸出結果。
son = son() #輸出結果: 我是父親
可以看到子類是沒有實例函數__init__()的,
但是創建實例的時候依然有輸出結果,並且是調用了父類father的實例函數,
但是並沒有調用父類mather類的實例函數,可見當子類繼承了父類之後,
子類也會繼承父類的函數,包括實例函數,但是只會繼承第一個父類的函數
方法的重寫:
當子類繼承了父類的函數之後,函數是子類需要的,但是函數體又不是子類需要的。
這時子類就要對父類的方法進行重寫
下麵直接進行實例代碼:
#eg: class Fruit: """水果類""" color = "綠色" def harvest(self,color): print("水果是"+color+"的!") print("水果已經收穫.....") print("水果原來是"+self.color+"的!") class Orange(Fruit): """橘子類繼承自水果類""" color = "橙色" def __init__(self): print("\n我是橙子") def harvest(self,color): #重寫父類函數harvest print("橘子是"+color+"的!") print("橙子已經收穫......") print("橙子原來是"+self.color+"的!") #創建Orange的對象 oran = Orange() oran.harvest("黃色")
輸出結果如下:
我是橙子 #子類Orange的構造函數 橘子是黃色的! 橙子已經收穫...... 橙子原來是橙色的! #這三句是子類繼承自父類Fruit的函數,但是函數體與父類的函數體不同也就是我們說的重寫
可以看到我們調用了繼承自Fruit的方法harvest但是輸出內容與父類的方法體不同,是因為我們在子類Orange中將harvest函數的函數體重寫了
下麵直接來一個小練習,廢話不多說直接上代碼:
""" 練習 設計藥品類medicine """ from datetime import datetime class Medicine: name = '' price = 0 PD = '' Exp = '' def __init__(self,name,price,PD,Exp): self.name = name #藥名 self.price = price #價格 self.PD = PD #生產日期 self.Exp = Exp #失效日期 def get_name(self): return self.name def get_GP(self): start = datetime.strptime(self.PD, '%Y-%m-%d') end = datetime.strptime(self.Exp,'%Y-%m-%d') return (end - start).days med = Medicine(name='格列寧',price=25000,PD='2018-9-8',Exp='2020-9-8') name = med.get_name() GP = med.get_GP() print(name) print(GP)
輸出結果:
格列寧
731
下一章咱們講講字元串的一些使用與註意事項
本博客皆是本人在自學Python期間的學習筆記,與一些學習心得,希望大家喜歡,每周一凌晨更新關於Python的知識。