開發者學堂課程【Python 語言基礎 3:函數、面向對象、異常處理:屬性和方法】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/601/detail/8744屬性和方法
目錄:
一、執行個體為什麼能通路到類中的屬性和方法
二、屬性和方法查找的一個流程
三、類對象和執行個體對象中都可以儲存屬性(方法)
p1.say_ hello()
p2.say_ hello()
print(p1.name,p2.name)
執行,得
你好!你好!
兩個都可以通路到 name 屬性。
兩個都存在于類屬性當中。
class Person
id
0x123
type
<class 'type'>
value
name = 'swk'say hello = fn
确實能通過執行個體 p1、p2 來進行通路
類中定義的屬性和方法都是公共的,任何該類執行個體都可以通路。
當我們調用一個對象的屬性時,解析器會先在目前對象中尋找是否含有該屬性。
1. 如果有,則直接傳回目前的對象的屬性值
2. 如果沒有,則去目前對象的類對象中去尋找,如果有,則傳回類對象的屬性值,如果沒有則報錯!!!
比如說
p1.name,就是要通路的是 p1 的 name 屬性,那麼通路 p1 的 name 屬性,就是要通路的是 變量 p1 值為 0x223 單的 name 屬性。
Person()
Id
0x223
Type
< class 'Person'>
Value
很明顯,這個對象沒有 name 屬性,value 裡面是空的,并沒有 name 屬性,是以就要去上一層,type 所對應的 person 對象裡頭去找 name 屬性,也就是找的是類裡頭的。
class Person
id
0x123
type
<class 'type'>
value
name = 'swk'say hello = fn
p2 同理,都是要去上一層去找 name 屬性。
是以,在調用一個對象屬性時,一定是先找的目前對象中是否含有該屬性。
1. 如果這個屬性(方法)是所有的執行個體共享的,則應該将其儲存到類對象中。
2. 如果這個屬性(方法)是某個執行個體獨有的,則應該儲存到執行個體對象中。
一般情況下,屬性儲存到執行個體對象,而方法需要儲存到類對象中。
p1. name = '豬八戒'
p2. name
=‘
沙和尚'
print(p1. name )
print(p2. name )
豬八戒
沙和尚
del p2.name # 删除 p2 的 name 屬性
如果删除 p2 的 name 屬性,那麼 p2 就會重新回到上一步,執行就會找到 swk
補充
def say_ hello(a)
print('你好!
’
)
方法變量裡頭至少有一個 a,這是一個形參。是以在調方法的時候,解析器裡頭預設會給定義一個實參。
def say_ hello(a)
# say_ _hel1o() 這個方法,可以顯示如下格式的資料:
# 你好! 我是 xxx
print('你好!
我是%
s
’ %
name)
是以在方法中不能直接通路類中的屬性,不然就會報錯。
但是,如果這樣
1.
print('你好!
我是%
s
’ %
p1.name)
你好!我是豬八戒
2.
print('你好!
我是%
s
’ %
p2.name)
你好!我是沙和尚
這樣還是不行,會很麻煩,會變得很死。
是以,當方法每次被調用時,解析器都會自動傳遞第一個實參。
是以,第一個參數,就是調用方法的對象本身
如果是 p1 調的,則第一個參數就是p1對象
如果是 p2 調的,則第一個參數就是p2對象
是以,在這裡叫 a 不好,一般我們都會将這個參數命名為 self(表示自己),形參不叫 a,而叫 self,因為它表示的是調用者本身。
print('你好!
我是%
s
’
%
self.name
)
這樣就會執行成功,當然,它不一定說一定叫 self,隻是因為習慣叫 self 來命名。