答案:self可以理解為一個字典變量,,內(nèi)部存的就是對象的數(shù)據(jù)屬性。如:{'name':'zhang','age':'18'}就是這些,。 注意只有數(shù)據(jù)屬性,,并沒有創(chuàng)建新的類的方法。 類----->通過實例化生成----對象---->(對象只是一串類似于字典的數(shù)據(jù),,沒有把類的里的方法復(fù)制給你,,python沒有new這個方法!) 在python2中分為 經(jīng)典類: class Box: pass 新式類: class Box(object): pass
在python3中,,只有新式類: class Box: pass
在python的class中的,self到底是什么,?
上實例: class.py 1 class Box: 2 def __init__(self, boxname, size, color): 3 self.boxname = boxname 4 self.size = size 5 self.color = color # self就是用于存儲對象屬性的集合,就算沒有屬性self也是必備的 6 7 def open(self, myself): 8 print('-->用自己的myself,,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname)) 9 print('-->用類自己的self,,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname)) 10 11 def close(self): 12 print('-->關(guān)閉%s,謝謝' % self.boxname) 13 14 15 b = Box('魔盒', '14m', '紅色') 16 b.close() 17 b.open(b) # 本來就會自動傳一個self,,現(xiàn)在傳入b,,就會讓open多得到一個實例對象本身,,print看看是什么。 18 print(b.__dict__) # 這里返回的就是self本身,,self存儲屬性,,沒有動作。 以上代碼當(dāng)中:
self 就是 對象/實例 屬性的集合,, 他們之間的關(guān)系如下: 1,、Box是個類 ——》實例化——》b 對象/實例
2、Box類python中顯示為:<class '__main__.Box'> (接下一行) ——》實例化:b=Box('魔盒', '14m', '紅色') (接下一行) ——》得到對象/實例b,,顯示為<__main__.Box object at 0x00000233857AA518>
3,、抽象體 (接下一行) ——》實例的過程 (接下一行) ——》得對對象,含有屬性:{'boxname': '魔盒', 'size': '14m', 'color': '紅色'},,即self,。
self看似是一整個對象,實際上描述明白一個類就是生產(chǎn)對象的過程,,描述了self就是得到了對象,。所以self內(nèi)的健值可以直接使用。 正如自然界中,,一個有效的對象,,必須包括:1、描述對象的屬性,;2,、對象的方法。 所以self是必須的,,也是對象中重要的特性,。
當(dāng)掌握了這個原理以后,我們試試以下的代碼,,感覺更加神奇,。讓我們明白重要的是它的思路: class02.py class Box: def myInit(mySelf, boxname, size, color): mySelf.boxname = boxname mySelf.size = size mySelf.color = color # 自己寫一個初始化函數(shù),一樣奏效,甚至不用self命名,。其它函數(shù)當(dāng)中用標(biāo)準(zhǔn)self return mySelf # 返回給實例化過程一個對象,!神奇!并且含有對象屬性/字典 # def __init__(self, boxname, size, color): # self.boxname = boxname # self.size = size # self.color = color #注釋掉原來標(biāo)準(zhǔn)的初始化 def open(self, myself): print(self) print('-->用自己的myself,,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname)) print('-->用類自己的self,,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname)) def close(self): print('-->關(guān)閉%s,謝謝' % self.boxname) # 經(jīng)過改造,,運行結(jié)果和標(biāo)準(zhǔn)初始化沒區(qū)別 b = Box().myInit('魔盒', '14m', '紅色') # b = Box('魔盒', '14m', '紅色')#注釋掉原來標(biāo)準(zhǔn)的初始化方法 b.close() b.open(b) # 本來就會自動傳一個self,,現(xiàn)在傳入b,就會讓open多得到一個實例對象本身,,print看看是什么,。 print(b.__dict__) # 這里返回的就是self本身,,self存儲屬性,沒有動作,。
換個角度來講,, 對類的操作有:1、定義屬性 2,、調(diào)節(jié)方法的選項 ——》在適當(dāng)?shù)脑O(shè)置以后《——— 類對的反饋有:1,、得到屬性 2、執(zhí)行方法
在類的函數(shù)當(dāng)中,,self為什么是必要參數(shù),,因為他是對象的載體,可以理解成一個字典,。 通過以下代碼演示: 1 class Box: 2 def myInit(mySelf, boxname, size, color): 3 print(mySelf.__dict__)#顯示為{}空字典 4 mySelf.boxname = boxname 5 mySelf.__dict__['aa'] = 'w'#甚至可以像字典一樣操作 6 mySelf.size = size 7 mySelf.color = color # 自己寫一個初始化函數(shù),,一樣奏效,甚至不用self命名。其它函數(shù)當(dāng)中用標(biāo)準(zhǔn)self 8 return mySelf # 返回給實例化過程一個對象,!神奇,!并且含有對象屬性/字典 9 10 # def __init__(self, boxname, size, color): 11 # self.boxname = boxname 12 # self.size = size 13 # self.color = color #注釋掉原來標(biāo)準(zhǔn)的初始化 14 15 def open(self, myself): 16 print(self) 17 print('-->用自己的myself,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname)) 18 print('-->用類自己的self,,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname)) 19 20 def close(self): 21 print('-->關(guān)閉%s,,謝謝' % self.boxname) 22 23 24 # 經(jīng)過改造,運行結(jié)果和標(biāo)準(zhǔn)初始化沒區(qū)別 25 26 b = Box().myInit('魔盒', '14m', '紅色') 27 # b = Box('魔盒', '14m', '紅色')#注釋掉原來標(biāo)準(zhǔn)的初始化方法 28 b.close() 29 b.open(b) # 本來就會自動傳一個self,,現(xiàn)在傳入b,,就會讓open多得到一個實例對象本身,print看看是什么,。 30 print(b.__dict__) # 這里返回的就是self本身,,self存儲屬性,沒有動作,。 執(zhí)行結(jié)果
{} -->關(guān)閉魔盒,謝謝 <__main__.Box object at 0x0000026A2CBAA5F8> -->用自己的myself,,打開那個紅色,14m的魔盒 -->用類自己的self,,打開那個紅色,14m的魔盒 {'boxname': '魔盒', 'aa': 'w', 'size': '14m', 'color': '紅色'}
注意看:'aa':'w' ,成功設(shè)置完成
|
|