关于python 类的使用
用的時候發現關于 python 的一些知識已經忘記一些了,還需要重新查找。
以下是根據記憶和查找網上資料完成的。
1 類命名的形式
(正確)
class One(object):def one_1(self, a):print("a:", a)object - 父類的名稱,表示繼承自 object 類。
要是沒有父類,也可以直接寫程 object ,如上個代碼并沒有父類,這樣寫可以。但是如下縮寫,就不符合 PEP8 要求(可以運行,但不規范),會提示你刪掉括號。
(不太正確)
class One():def one_1(self, a):print("a:", a)刪除括號后,即為
(正確)
class One:def one_1(self, a):print("a:", a)也可以理解為,若沒有父類,可以什么都不寫
2 類的使用
2.1 正確用法
示例
(?錯誤)
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: 22.2 類的實例化 or 賦值——id( )
關于類的賦值還是實例化看其內存地址就可以了(不要較真 深拷貝)。
很明顯地址一樣的話,肯定是賦值,意味 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): 27303775683842.3 類的實例化 or 賦值——type()
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)?
2.4 類中 self 的含義
從上面的運行情況可知,類中self 含義是不一樣的。
| 賦值 | 實例化時 |
| class one:def one_1(self, a):print("self:", self)print("a:", a)get_one = one
get_one.one_1(2, 3) # self: 2 # a: 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 直接來個斬首行動,這時候“城外”的力量還沒有回過神時已經完成作戰任務,取走了所需要的“函數”。
所以“空降斬首”明顯不現實,不是常規操作。
?
3 相關參考
廖雪峰 類和實例?https://www.liaoxuefeng.com/wiki/897692888725344/923030500932512
Python中self用法詳解https://blog.csdn.net/CLHugh/article/details/75000104
?
轉載于:https://www.cnblogs.com/gengyi/p/11623442.html
總結
以上是生活随笔為你收集整理的关于python 类的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个低级错误引发Netty编码解码中文异
- 下一篇: 顺序表(C语言)