前言:本文主要介紹python面對對象中的類和對象,包括類和對象的概念、類的定義、類屬性、實例屬性及實例方法等。
一、類和對象的概念
問題:什么是類?什么是實例對象?
類:是一類事物的抽象概念,不是真實存在的,描繪了該類事物共有的特征和行為
-
例如:貓類、狗類、鳥類、車類等
實例對象:某類事物的具體個體,是該類事物的具體表現,它是真實存在的
1)遵循標識符的命名規范,即由字母、數字及下划線組成且不能以數字開頭,不能使用關鍵字。
2)建議使用大駝峰命名法(每個單詞的第一個字母大寫,
class Dog: # 創建一個狗類 cry = '汪汪汪' # 類屬性 leg = '四只腳' # 類屬性 wangcai = Dog() # 創建一個實例對象,旺財是一只具體的狗 print('通過類名直接訪問類屬性:'.format(Dog.cry)) # 通過類名直接訪問類屬性 print('通過實例對象訪問類屬性:'.format(wangcai.cry)) # 通過實例對象訪問類屬性
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py
通過類名直接訪問類屬性:
通過實例對象訪問類屬性:
Process finished with exit code 0
2.實例屬性
什么是實例屬性?就是實例對象特有的屬性,比如旺財是一個實例對象,他的名字叫旺財,這個名字就是一個實例屬性
實例屬性:實例對象特有的屬性,添加實例屬性的方式:
- 實例對象.屬性 = 屬性值
- 定義在類里的__init__方法里的變量
實例屬性的訪問:實例屬性只有該實例對象自己能訪問
class Dog: # 創建一個狗類 cry = '汪汪汪' # 類屬性 leg = '四只腳' # 類屬性 def __init__(self, name, age): """實例對象初始化方法""" self.name = name self.age = age # 創建一個實例對象,因為有初始化方法__init__,定義了兩個必需參數,因此實例化對象時需要傳兩個參數 wangcai = Dog(name='旺財', age='4') # wangcai = Dog('旺財', '4') 這種寫法也可以,順序對應參數即可 dog_name = wangcai.name dog_age = wangcai.age print('狗的名字:{}'.format(dog_name)) # 實例屬性只能該實例對象訪問 print('狗的年齡:{}'.format(dog_age)) # 通過 實例對象.屬性 = 屬性值 再添加一個實例屬性 wangcai.skill = '爬樹' print(wangcai.skill) # print(Dog.name) # 實例屬性是不能通過類去訪問的,會報錯 jojo = Dog('jojo', 3) # 實例化對象,一只叫jojo的狗 dog_name2 = jojo.name # jojo只能訪問自己的屬性,不能訪問其他實例對象(旺財)的屬性 print('狗的名字:{}'.format(dog_name2))
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py 狗的名字:旺財 狗的年齡:4 爬樹 狗的名字:jojo Process finished with exit code 0
在上面例子中使用了一個__init__方法,這些是什么方法呢?被雙下划線包起來的方法,是python中有特殊語義的方法,也叫魔術方法,注意自定義方法時不要用這個格式命名。魔術方法不需要手動調用,在指定的條件下會自動觸發,而這個__init__方法是在創建實例對象時就會自動觸發。
3.關於self的理解
細心的你是不是發現了?在上面的例子,類里的init方法還有一個參數self,self是什么?有什么作用?
self可以理解為自己,即實例對象本身,哪個實例對象去調用,這個self就指向哪個實例對象,python解釋器會把這個實例對象作為第一個參數傳給self。這樣是不是就能解釋為什么實例屬性只能該實例對象去訪問呢。如果覺得有點繞,多理解幾遍,多敲幾遍吧!
四、實例方法
1.實例方法的定義
- 實例方法直接定義在類中
- 實例方法的第一個參數為self(這個參數必須要寫)
2.實例方法的訪問
- 通過實例對象直接調用,該類的實例對象都可以訪問,訪問實例方法時會自動將實例對象本身作為第一個參數傳給self接收
- 通過類調用實例方法時,要傳遞一個self參數,即傳遞一個實例對象(很少用這種方法)
class Dog: # 創建一個狗類 cry = '汪汪汪' # 類屬性 leg = '四只腳' # 類屬性 def __init__(self, name, age): """實例對象初始化方法""" self.name = name self.age = age def skill(self): sk1 = '爬樹' # 這里定義的只是一個方法里的變量,其他方法是無法調用的 print('技能1:{}'.format(sk1)) def skill2(self, sk2): self.sk2 = sk2 # 接收參數sk2,這里為什么要用self.去接收?因為這樣相當於定義了一個實例屬性,self就是指向實例對象 print('技能2:{}'.format(self.sk2)) def skill3(self): print('技能3:{}'.format(self.sk2)) # 這里訪問self.sk2就能訪問 print('技能4:{}'.format(sk1)) # 這里訪問sk1會報錯,找不到 wangcai = Dog(name='旺財', age='4') # wangcai = Dog('旺財', '4') 這種寫法也可以,順序對應參數即可 dog_name = wangcai.name dog_age = wangcai.age print('狗的名字:{}'.format(dog_name)) # 實例屬性只能該實例對象訪問 print('狗的年齡:{}'.format(dog_age)) wangcai.skill() # 通過實例對象直接調用實例方法 wangcai.skill2('抓老鼠') # 調用實例方法,該實例方法定義了一個必須參數 wangcai.skill3()
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py Traceback (most recent call last): 狗的名字:旺財 File "D:/learn/python18_http_request/exercise/test.py", line 31, in <module> 狗的年齡:4 技能1:爬樹 技能2:抓老鼠 技能3:抓老鼠 wangcai.skill3() File "D:/learn/python18_http_request/exercise/test.py", line 20, in skill3 print('技能4:{}'.format(sk1)) # 這里訪問sk1會報錯,找不到 NameError: name 'sk1' is not defined Process finished with exit code 1
下面演示一個通過類訪問實例方法(了解即可):
class Dog: # 創建一個狗類 cry = '汪汪汪' # 類屬性 leg = '四只腳' # 類屬性 def __init__(self, name, age): """實例對象初始化方法""" self.name = name self.age = age def skill(self): sk1 = '爬樹' # 這里定義的只是一個方法里的變量,其他方法是無法調用的 print('技能1:{}'.format(sk1)) def skill2(self, sk2): self.sk2 = sk2 # 接收參數sk2,這里為什么要用self.去接收?因為這樣相當於定義了一個實例屬性 print('技能2:{}'.format(self.sk2)) wangcai = Dog(name='旺財', age='4') # wangcai = Dog('旺財', '4') 這種寫法也可以,順序對應參數即可 dog_name = wangcai.name dog_age = wangcai.age print('狗的名字:{}'.format(dog_name)) # 實例屬性只能該實例對象訪問 print('狗的年齡:{}'.format(dog_age)) # 通過類調用實例方法:要傳遞一個self參數,即傳遞一個實例對象 Dog.skill(wangcai) # 傳遞一個實例對象 Dog.skill2(wangcai, '抓老鼠') # 傳遞完實例對象再傳方法里的必需參數
運行結果:
C:\software\python\python.exe D:/learn/python18_http_request/exercise/test.py 狗的名字:旺財 狗的年齡:4 技能1:爬樹 技能2:抓老鼠 Process finished with exit code 0