一、類的用法
1.1 類的構造
類即類別、種類,是面向對象設計最重要的概念,對象是特徵和技能的結合體,而類是一系列對象相似的特徵與技能的結合體。
在程序中,務必保證先定義類,後產生對象。
類和函數的使用是類似的,先定義函數,後調用函數,類也一樣。在程序中先定義類,後調用類。不一樣的是,調用函數會執行函數體代碼返回的是函數執行的結果,而調用類會產生對象,返回的是對象。
定義類,使用關鍵字class + 空格 + 類名,類名用大駝峯命名,變量名推薦使用“_”這種方式就是爲了區分。
class DeepshareStudent:
# 用變量名錶示特徵
school = 'deepshare'
# 用函數表示技能
def learn(self):
"""
self是使用pycharm自動添加的,寫成xxx也是一樣的,就是一個位置參數,必須被傳值。
"""
print('is learning')
print('=====>')
- 類是特徵與技能的結合體,所以類中最常見的就是變量和函數,但是類中也可以有任意的python代碼;
- 執行以上代碼,會發現會打印一行箭頭,這就說明這段代碼運行了,這說明在定義類的階段會立刻執行類體內的代碼;
- 既然執行了代碼,有變量有函數,那就會將產生的名字存放於類的名稱空間;
1.2 類的查看
使用類型.__dict__方法可以查看類的函數和變量;
name_and_func = DeepshareStudent.__dict__
print(name_and_func)
# 輸出
"""
{
'__module__': '__main__',
'school': 'deepshare',
'learn': <function DeepShare.learn at 0x000002764C2F1D08>,
'__dict__': <attribute '__dict__' of 'DeepShare' objects>,
'__weakref__': <attribute '__weakref__' of 'DeepShare' objects>,
'__doc__': None}
"""
注意這是一個字典的格式,因爲有名字有內存地址,這是一一對應的關係,最合適使用字典存儲;
print(name_and_func['school'])
print(name_and_func['learn'])
# 執行代碼輸出
"""
deepshare
<function DeepShare.learn at 0x000002764C2F1D08>
可以看到name_and_func['learn']是一個函數的內存地址,那麼加(0應該就能調用
"""
#執行以下代碼
name_and_func['learn']()
# 結果報錯了,錯誤類型說learn()這個函數少了一個位置參數‘self’,在learn函數中,位置參數self必須被傳值。代碼可以改爲
name_and_func['learn']('albert')
在類的函數中,self指的是類的對象本身。
每次想拿到類的函數或者變量的時候可以使用上面的方法,但是這樣很麻煩,可以使用下面的方法:
DeepshareStudent.school
DeepshareStudent.learn
1.3類的修改
# 修改類的屬性值
DeepshareStudent.school = 'zzz'
# 給類添加屬性
DeepshareStudent.country = 'china'
# 刪除類的屬性
del DeepshareStudent.country
二、對象的用法
面向對象的核心是對象,當把類造出來,類相當於一個模板或者是工廠,接下來需要使用類批量生產對象。
定義類
class DeepshareStudent:
school = 'deepshare'
def learn(self):
print('is learning')
調用類的方式和調用函數一樣,類後面加括號;
DeepshareStudent()
# 執行代碼沒有任何結果
調用類的同時會產生對象,只需要把它賦值給對象就可以了
stu1 = DeepshareStudent()
stu2 = DeepshareStudent()
stu3 = DeepshareStudent()
每調用一次,類的模板就會加工一個對象,但是這麼做加工出來的對象沒有區別,每次得到的對象是一樣的,但實際上我們需要的對象肯定不是完全一樣的。這時候我們需要一個def init()函數。init()函數在產生對象的時候會被自動執行,從而可以給對象中的變量進行賦值。
def __init__(self,x,y,z):
self.NAME = x
self.AGE = y
self.GENDER = z
這樣就實現了我們的需求,因此類可以寫爲:
class DeepshareStudent:
school = 'deepshare'
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def learn(self):
print('is learning')
這樣創建的類既有公共屬性又有私有屬性。注意self是對象本身,它是在調用類產生對象時自動傳值的。寫代碼時pacharm會自動添加這個self,也可以寫爲其它變量名,例如aaa,不過意義不明確,但是不寫是不行的。