关于python 类的使用
用的時候發(fā)現(xiàn)關(guān)于 python 的一些知識已經(jīng)忘記一些了,還需要重新查找。
以下是根據(jù)記憶和查找網(wǎng)上資料完成的。
1 類命名的形式
(正確)
class One(object):def one_1(self, a):print("a:", a)object - 父類的名稱,表示繼承自 object 類。
要是沒有父類,也可以直接寫程 object ,如上個代碼并沒有父類,這樣寫可以。但是如下縮寫,就不符合 PEP8 要求(可以運(yùn)行,但不規(guī)范),會提示你刪掉括號。
(不太正確)
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)運(yùn)行
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'報(bào)錯:one_1 函數(shù)缺少一個位置參數(shù),“a”。
我們將傳參做修改,變成兩個參數(shù)。
(錯誤?,但可以運(yùn)行)
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)運(yùn)行
self: 2 a: 3很明顯,這是由于類沒有實(shí)例化造成的,?get_one = one?只是將類 one 當(dāng)成一個“變量”賦值給 get_one(實(shí)際上是傳遞了地址),而不是實(shí)例化。
將上述代碼進(jìn)行修改,實(shí)現(xiàn)類的實(shí)例化。
(正確?)
class one:def one_1(self, a):print("a:", a)get_one = one() get_one.one_1(2)運(yùn)行
a: 22.2 類的實(shí)例化 or 賦值——id( )
關(guān)于類的賦值還是實(shí)例化看其內(nèi)存地址就可以了(不要較真 深拷貝)。
很明顯地址一樣的話,肯定是賦值,意味 one 和 get_one_f 指向同一個地址。
實(shí)例化則不然,類 one 是一個抽象的“模板”,而實(shí)例化的 get_one_s 是一個具體的“對象”,是一個變量;所以它們的地址肯定不一樣,經(jīng)過代碼測試確實(shí)不是同一地址。
需要注意的是,實(shí)例化后的每一個“個體”的地址是不一樣的。
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# 實(shí)例化 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 類的實(shí)例化 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'>實(shí)例化后的變量可以綁定類中的方法或?qū)傩?即?one().one_1(2)?
2.4 類中 self 的含義
從上面的運(yùn)行情況可知,類中self 含義是不一樣的。
| 賦值 | 實(shí)例化時 |
| 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> ? |
?
在看兩者的區(qū)別時,我們先知悉以下內(nèi)容:
為了比較,其實(shí)我沒有添加 __init__ 方法,在該方法中,第一個參數(shù)一定是 self,其表示創(chuàng)建實(shí)例本身;因此,在 __init__ 方法內(nèi)部,就可以把各種屬性綁定到 self,因此self就指向創(chuàng)建的實(shí)例本身。
?
接下來分析賦值與實(shí)例化時的self的含義:
1 賦值時,相當(dāng)于直接調(diào)用類 one 中的 one_1 方法,此時 one_1 僅僅是一個非常普通的函數(shù),而不是一個 ”特殊的函數(shù)“。
類中的方法可以當(dāng)成一個特殊的函數(shù),一個重要的特殊點(diǎn)在于它能夠調(diào)用類內(nèi)的屬性。
此時?one_1(self, a)?函數(shù)中相當(dāng)于兩個常規(guī)變量,而不是 “實(shí)例化指針”。
?
2 實(shí)例化時,我們實(shí)例化例子,self 和 get_one 兩者地址是一樣的,也就是說,self 就是創(chuàng)建實(shí)例本身,凸顯類內(nèi) “函數(shù)” 的特殊性;所以此時只有一個參數(shù)。
?
self : <__main__.one object at 0x00000183C6926048> get_one: <__main__.one object at 0x00000183C6926048>?
?
?
此時,我想應(yīng)該可以類比于古代的攻城作戰(zhàn),城池相當(dāng)于一個類;
當(dāng)敵人從“外郭”進(jìn)攻時,堡壘內(nèi)的所有的兵、民等所有力量都能被調(diào)動,這就是實(shí)例化;
當(dāng)敵人直接空降“內(nèi)城”,對“內(nèi)城”中的大 BOSS 直接來個斬首行動,這時候“城外”的力量還沒有回過神時已經(jīng)完成作戰(zhàn)任務(wù),取走了所需要的“函數(shù)”。
所以“空降斬首”明顯不現(xiàn)實(shí),不是常規(guī)操作。
?
3 相關(guān)參考
廖雪峰 類和實(shí)例?https://www.liaoxuefeng.com/wiki/897692888725344/923030500932512
Python中self用法詳解https://blog.csdn.net/CLHugh/article/details/75000104
?
轉(zhuǎn)載于:https://www.cnblogs.com/gengyi/p/11623442.html
總結(jié)
以上是生活随笔為你收集整理的关于python 类的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个低级错误引发Netty编码解码中文异
- 下一篇: 顺序表(C语言)