關於python 類的使用

用的時候發現關於 python 的一些知識已經忘記一些了,還須要從新查找。python

如下是根據記憶和查找網上資料完成的。函數

1 類命名的形式

(正確)測試

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)

也能夠理解爲,若沒有父類,能夠什麼都不寫對象

2 類的使用

2.1 正確用法

示例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

2.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): 2730377568384

2.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用法詳解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/

 

 這個整理的至關詳細,很是贊

相關文章
相關標籤/搜索