日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python中:self和__init__的含义 + 为何要有self和__init__

發布時間:2025/4/5 python 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python中:self和__init__的含义 + 为何要有self和__init__ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

本文轉自:

http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/

背景

回復:

我寫的一些Python教程,需要的可以看看

中SongShouJiong的提問:

Python中的self,__init__的含義是啥?

為何要有self,__init這些東西?

?

解釋之前,先說幾句

1.到目前為止,我雖然也已寫了不算很少的python的代碼,但是,還真的沒有太多接觸self和__init__這兩個東西。

只能算是大概了解。

2.為了搞懂其含義,現學現賣,去看了些資料,然后整理出來。

其中,很可能理解有誤,還請高手指正。

3.解釋含義之前,先說說對于學習Python中的self和__init__等內容的態度:

個人的建議是,很多東西,等你有了需求了,再去使用,該東西才算有價值,你也才會更容易理解;

否則,暫時接觸不到的話,其實可以將其放到一邊,等以后遇到了再說。

否則,現在就去努力的學,態度雖好,但是由于沒有相關的編程實踐,即沒有足夠的代碼的練習,對于概念的理解,必然很難深入。

因此,對于Python中的self和__init__的建議是:

如果你去寫Python代碼,去學習Python的過程中,在沒有遇到之前,

比如像我這種,一直就沒怎么編寫過真正的類(Class),那么倒也是可以暫時不用太理會這些東西;

等以后需要編寫類的時候,再去詳細學習,了解,搞懂其含義。

4.下面的內容,算是為你,的確遇到了self,__init__,的時候,需要理解其含義的時候,提供一些參考。

5.在看下面的解釋之前,你首先要對類(Class)和類的實例化的對象(Object,也稱實例Instance)的概念,有所了解。

如果不了解,可以參考我總結的:

【整理】面向對象的基礎知識:類Class,對象(Object),實例(Instance)

?

?

?

python中self和__init__的含義 + 為何要有self和__init__

Python中的self

在Python中的類Class的代碼中,常看到函數中的第一個參數,都是self。

以及Class中的函數里面,訪問對應的變量(讀取或者寫入),以及調用對應的函數時,都是

self.valueName

self.function()

的形式。

?

下面就來解釋一下self的含義:

?

Python中self的含義

self,英文單詞意思很明顯,表示自己,本身。

此處有幾種潛在含義:

1.這里的自己,指的是,實例Instance本身。

2.同時, 由于說到“自己”這個詞,都是和相對而言的“其他”而說的。

而此處的其他,指的是,類Class,和其他變量,比如局部變量,全局變量等。

?

此處的self,是個對象,Object。

是當前類的實例。

因此,對應的

self.valueName

self.function()

中的

valueName:表示self對象,即實例的變量。與其他的,Class的變量,全局的變量,局部的變量,是相對應的。

function:表示是調用的是self對象,即實例的函數。與其他的全局的函數,是相對應的。

?

Python中為何要有self

上面其實已經基本上說清楚了,為何需要有self。

那就是:

在類的代碼(函數)中,需要訪問當前的實例中的變量和函數的,即,訪問Instance中的:

  • 對應的變量(property):Instance.ProperyNam,去讀取之前的值和寫入新的值

  • 調用對應函數(function):Instance.function(),即執行對應的動作

-> 而需要訪問實例的變量和調用實例的函數,當然需要對應的實例Instance對象本身

-> 而Python中就規定好了,函數的第一個參數,就必須是實例對象本身,并且建議,約定俗成,把其名字寫為self

-> 所以,我們需要self(需要用到self)

?

而如果沒有用到self,即代碼中,去掉self后,那種寫法所使用到的變量,實際上不是你所希望的,不是真正的實例中的變量和函數,而是的訪問到了其他部分的變量和函數了。

甚至會由于沒有合適的初始化實例變量,而導致后續無法訪問的錯誤。

下面,就通過代碼,來演示,如果去掉self,或者沒有合理的使用self,會出現哪些錯誤。

?

如果沒有在__init__中初始化對應的實例變量的話,導致后續引用實例變量會出錯

如下代碼,完整的演示了,如果沒有在類Class的最初的__init__函數中,正確的初始化實例變量,則會導致后續沒有變量可用,因而出現AttributeError的錯誤:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#!/usr/bin/python

# -*- coding: utf-8 -*-

"""

-------------------------------------------------------------------------------

Function:

【整理】Python中:self和init__的含義 + 為何要有self和__init__

http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them

??

Author:???? Crifan

Verison:??? 2012-11-27

-------------------------------------------------------------------------------

"""

??

#注:此處全局的變量名,寫成name,只是為了演示而用

#實際上,好的編程風格,應該寫成gName之類的名字,以表示該變量是Global的變量

name="whole global name";

??

classPerson:

????def__init__(self, newPersionName):

????????#self.name = newPersionName;

??????????

????????#1.如果此處不寫成self.name

????????#那么此處的name,只是__init__函數中的局部臨時變量name而已

????????#和全局中的name,沒有半毛錢關系

????????name=newPersionName;

??????????

????????#此處只是為了代碼演示,而使用了局部變量name,

????????#不過需要注意的是,此處很明顯,由于接下來的代碼也沒有利用到此處的局部變量name

????????#則就導致了,此處的name變量,實際上被浪費了,根本沒有利用到

??

????defsayYourName(self):

????????#此處由于找不到實例中的name變量,所以會報錯:

????????#AttributeError: Person instance has no attribute 'name'

????????print'My name is %s'%(self.name);

??

defselfAndInitDemo():

????persionInstance=Person("crifan");

????persionInstance.sayYourName();

??????

###############################################################################

if__name__=="__main__":

????selfAndInitDemo();

?

從上述代碼可見,由于在類的初始化(實例化)的__init__函數中,沒有給self.name設置值,使得實例中,根本沒有name這個變量,導致后續再去訪問self.name,就會出現AttributeError的錯誤了。

對應的,如果寫成self.name,則意思就正確了,就是初始化的時候,給實例中新增加,并且正常設置了正確的值newPersionName了,所以后續再去通過self.name,就可以訪問到,當前實例中正確的變量name了。

相應的正確寫法的代碼如下:

?

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

#!/usr/bin/python

# -*- coding: utf-8 -*-

"""

-------------------------------------------------------------------------------

Function:

【整理】Python中:self和init__的含義 + 為何要有self和__init__

http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them

??

Author:???? Crifan

Verison:??? 2012-11-27

-------------------------------------------------------------------------------

"""

??

#注:此處全局的變量名,寫成name,只是為了演示而用

#實際上,好的編程風格,應該寫成gName之類的名字,以表示該變量是Global的變量

name="whole global name";

??

classPerson:

????def__init__(self, newPersionName):

????????#此處正確的,通過訪問self.name的形式,實現了:

????????#1.給實例中,增加了name變量

????????#2.并且給name賦了初值,為newPersionName

????????self.name=newPersionName;

??

????defsayYourName(self):

????????#此處由于開始正確的初始化了self對象,使得其中有了name變量,所以此處可以正確訪問了name值了,可以正確的輸出了:

????????#My name is crifan

????????print'My name is %s'%(self.name);

??

defselfAndInitDemo():

????persionInstance=Person("crifan");

????persionInstance.sayYourName();

??????

###############################################################################

if__name__=="__main__":

????selfAndInitDemo();

?

在函數中,使用對應的變量,雖然代碼是可以運行的,但是實際上卻是使用的,不是實例中的變量

有時候,雖然你寫的代碼,可以運行,但是使用到的變量,由于沒有加self,實際上是用到的不是實例的變量,而是其他的變量。

此類問題,主要和Python中的變量的作用域有關,但是此處例子中,也和是否使用self有關:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#!/usr/bin/python

# -*- coding: utf-8 -*-

"""

-------------------------------------------------------------------------------

Function:

【整理】Python中:self和init__的含義 + 為何要有self和__init__

http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them

??

Author:???? Crifan

Verison:??? 2012-11-27

-------------------------------------------------------------------------------

"""

??

#注:此處全局的變量名,寫成name,只是為了演示而用

#實際上,好的編程風格,應該寫成gName之類的名字,以表示該變量是Global的變量

name="whole global name";

??

classPerson:

????name="class global name"

??

????def__init__(self, newPersionName):

????????#self.name = newPersionName;

??????????

????????#此處,沒有使用self.name

????????#而使得此處的name,實際上仍是局部變量name

????????#雖然此處賦值了,但是后面沒有被利用到,屬于被浪費了的局部變量name

????????name=newPersionName;

??

????defsayYourName(self):

????????#此處,之所以沒有像之前一樣出現:

????????#AttributeError: Person instance has no attribute 'name'

????????#那是因為,雖然當前的實例self中,沒有在__init__中初始化對應的name變量,實例self中沒有對應的name變量

????????#但是由于實例所對應的類Person,有對應的name變量,所以也是可以正常執行代碼的

????????#對應的,此處的self.name,實際上是Person.name

????????print'My name is %s'%(self.name);# -> class global name

????????print'name within class Person is actually the global name: %s'%(name);#-> whole global name

????????print"only access Person's name via Person.name=%s"%(Person.name);# -> class global name

??

defselfAndInitDemo():

????persionInstance=Person("crifan");

????persionInstance.sayYourName();

????print"whole global name is %s"%(name);# -> whole global name

??????

###############################################################################

if__name__=="__main__":

????selfAndInitDemo();

?

其中,可見,此處開始__init__中,沒有給self實例初始化對應的name

而后面的函數sayYourName中,雖然可以調用到self.name而沒有出現AttributeError錯誤

但是實際上此處的值,不是所期望的,傳入的name,即"crifan",而是類中的name的值,即"class global name"。

?

關于Python中變量的作用域的詳細解釋,可參考:

【整理】Python中變量的作用域(variable scope)

?

Python中的__init__

Python中,常會看到,很多類中,都有一個__init__函數。

下面就來解釋一下,__init__的含義。

?

Python中__init__的含義

首先來看init單詞本身,其含義是 初始化。

而__init__的含義,也如同其單詞本意一樣,用來初始化。

但是給誰初始化呢?

很明顯,是給對應的類Class本身,去初始化。

?

Python中為何要有__init__

我的理解是,__init__的出現,主要有兩方面的作用:

一般常見的初始化,我的理解,可能主要有兩方面:

?

支持帶參數的類的初始化

這個用法,感覺就像,其他語言中的,對于Class初始化時,可以運行傳遞不同的參數一樣;

用代碼演示如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

#!/usr/bin/python

# -*- coding: utf-8 -*-

"""

-------------------------------------------------------------------------------

Function:

【整理】Python中:self和init__的含義 + 為何要有self和__init__

http://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them

??

Author:???? Crifan

Verison:??? 2012-11-27

-------------------------------------------------------------------------------

"""

??

classPerson:

????def__init__(self, newPersionName):

????????#在開始初始化新的類Class的示例Instance的時候,給對應的,不同的Instance,設置不同的人名(Person name)

????????self.name=newPersionName;

??

????defsayYourName(self):

????????#不同的Person的示例,調用同樣的方法的時候,說出自己的名字,結果都是對應著自己的,各自不同的名字

????????print'My name is %s'%(self.name);#My name is crifan

??

definitDemo():

????persionInstance=Person("crifan");

????persionInstance.sayYourName();

??????

###############################################################################

if__name__=="__main__":

????initDemo();

其中,就是針對Person這個類,

不同的示例,在初始化的時候,都傳遞一個對應的參數,這樣不同的Person,就都有了自己的不同的名字了。

這個,至少看起來,有點類似于,其他語言中的,傳遞特定參數去對類進行初始化。

?

實現類本身相關內容的初始化

當一個Class,稍微復雜一點的時候,或者內部函數需要用得到的時候,往往都需要在,別人實例化你這個類之前,使用你這個類之前,做一些基本的,與自己的類有關的,初始化方面的工作。

而這部分工作,往往就放到__init__函數中去了。

換句話說,你要用人家的類(中的變量和函數)之前,總要給人家一個機會,做點準備工作,然后才能為你服務吧。

這個概念,相對還是很好理解的,就不多贅述。

演示代碼就不用了,因為上面的代碼,也可以算是這方面的例子了,不同的人,應該有不同的名字,而給不同的人設置不同的名字,也是需要在調用sayYourName之前,就先初始化好的。

?

參考資料

?
1.?使用__init__方法

2.?了解何時去使用 self 和 __init__? ? ?#鏈接已失效

3.Python 'self' explained

4.?Python __init__ and self what do they do?

轉載于:https://my.oschina.net/bysu/blog/777901

總結

以上是生活随笔為你收集整理的Python中:self和__init__的含义 + 为何要有self和__init__的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。