python編程之路——類和對象

一、類的用法

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,不過意義不明確,但是不寫是不行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章