用的時候發現關於 python 的一些知識已經忘記一些了,還須要從新查找。python
如下是根據記憶和查找網上資料完成的。函數
(正確)測試
class One(object): def one_1(self, a): print("a:", a)
object - 父類的名稱,表示繼承自 object 類。ui
要是沒有父類,也能夠直接寫程 object ,如上個代碼並無父類,這樣寫能夠。可是以下縮寫,就不符合 PEP8 要求(能夠運行,但不規範),會提示你刪掉括號。spa
(不太正確).net
class One(): def one_1(self, a): print("a:", a)
刪除括號後,即爲指針
(正確)code
class One: def one_1(self, a): print("a:", a)
也能夠理解爲,若沒有父類,能夠什麼都不寫對象
示例blog
(❌錯誤)
1 class one: 2 def one_1(self, a): 3 print("a:", a) 4 5 get_one = one 6 get_one.one_1(2)
運行
File "C:/Users/Administrator/Desktop/tf.py", line 6, in <module> get_one.one_1(2) TypeError: one_1() missing 1 required positional argument: 'a'
報錯:one_1 函數缺乏一個位置參數,「a」。
咱們將傳參作修改,變成兩個參數。
(錯誤❌,但能夠運行)
1 class one: 2 def one_1(self, a): 3 print("self:",self) 4 print("a:", a) 5 6 get_one = one 7 get_one.one_1(2,3)
運行
self: 2
a: 3
很明顯,這是因爲類沒有實例化形成的, get_one = one 只是將類 one 當成一個「變量」賦值給 get_one(其實是傳遞了地址),而不是實例化。
將上述代碼進行修改,實現類的實例化。
(正確✔)
class one: def one_1(self, a): print("a:", a) get_one = one() get_one.one_1(2)
運行
a: 2
關於類的賦值仍是實例化看其內存地址就能夠了(不要較真 深拷貝)。
很明顯地址同樣的話,確定是賦值,意味 one 和 get_one_f 指向同一個地址。
實例化則否則,類 one 是一個抽象的「模板」,而實例化的 get_one_s 是一個具體的「對象」,是一個變量;因此它們的地址確定不同,通過代碼測試確實不是同一地址。
須要注意的是,實例化後的每個「個體」的地址是不同的。
class one: def one_1(self, a): print("a:", a) # 賦值 get_one_f = one print("id(one):", id(one)) print("id(get_one_f):", id(get_one_f)) # id(one): 2730363295608 # id(get_one_f): 2730363295608 # 實例化 get_one_s = one() print("id(one):", id(one)) print("id(get_one_s):", id(get_one_s)) # id(one): 2730363295608 # id(get_one_s): 2730377568384
class one: def one_1(self, a): print("a:", a) print("type(one):", type(one)) print("type(one()):", type(one())) # type(one): <class 'type'> # type(one()): <class '__main__.one'>
實例化後的變量能夠綁定類中的方法或屬性,即 one().one_1(2)
從上面的運行狀況可知,類中self 含義是不同的。
賦值 | 實例化時 |
class one: def one_1(self, a): print("self:", self) print("a:", a) get_one = one get_one.one_1(2, 3)
|
class one: def one_1(self, a): print("a:", a) print("self :", self) get_one = one() get_one.one_1(2) print("get_one:", get_one) # a: 2 # self : <__main__.one object at 0x00000183C6926048> # get_one: <__main__.one object at 0x00000183C6926048>
|
在看二者的區別時,咱們先知悉如下內容:
爲了比較,其實我沒有添加 __init__ 方法,在該方法中,第一個參數必定是 self,其表示建立實例自己;所以,在 __init__ 方法內部,就能夠把各類屬性綁定到 self,所以self就指向建立的實例自己。
接下來分析賦值與實例化時的self的含義:
1 賦值時,至關於直接調用類 one 中的 one_1 方法,此時 one_1 僅僅是一個很是普通的函數,而不是一個 」特殊的函數「。
類中的方法能夠當成一個特殊的函數,一個重要的特殊點在於它可以調用類內的屬性。
此時 one_1(self, a) 函數中至關於兩個常規變量,而不是 「實例化指針」。
2 實例化時,咱們實例化例子,self 和 get_one 二者地址是同樣的,也就是說,self 就是建立實例自己,凸顯類內 「函數」 的特殊性;因此此時只有一個參數。
self : <__main__.one object at 0x00000183C6926048> get_one: <__main__.one object at 0x00000183C6926048>
此時,我想應該能夠類比於古代的攻城做戰,城池至關於一個類;
當敵人從「外郭」進攻時,堡壘內的全部的兵、民等全部力量都能被調動,這就是實例化;
當敵人直接空降「內城」,對「內城」中的大 BOSS 直接來個斬首行動,這時候「城外」的力量尚未回過神時已經完成做戰任務,取走了所須要的「函數」。
因此「空降斬首」明顯不現實,不是常規操做。
廖雪峯 類和實例 https://www.liaoxuefeng.com/wiki/897692888725344/923030500932512
Python中self用法詳解http://www.javashuo.com/article/p-rqyzdjxe-x.html
【整理】Python中:self和__init__的含義 + 爲什麼要有self和__init__ https://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/
這個整理的至關詳細,很是贊