Python 類class 中__init__ 函式以及引數self - 程式人生
文章推薦指數: 80 %
Python中的self等價於C++中的self指標和Java、C#中的this引數。
5)一個簡單例項. 5.1程式碼如下 class person(): def __init__(self,name,gender ...
程式人生>>Python類class中__init__函式以及引數self
Python類class中__init__函式以及引數self
阿新••發佈:2018-12-12
1)class類包含:
.
類的屬性:類中所涉及的變數 類的方法:類中函式
2)_init_函式(方法)
1.首先說一下,帶有兩個下劃線開頭的函式是宣告該屬性為私有,不能在類地外部被使用或直接訪問。
2.init函式(方法)支援帶引數的類的初始化,也可為宣告該類的屬性 3.init函式(方法)的第一個引數必須是self(self為習慣用法,也可以用別的名字),後續引數則可以自由指定,和定義函式沒有任何區別。
3)函式定義 Python程式設計中對於某些需要重複呼叫的程式,可以使用函式進行定義,基本形式為: def函式名(引數1,引數2,……,引數N):其程式碼形式如下面所示:
deffunction_name(parameters):
block
returnvalue
注意在類的內部,使用def關鍵字可以為類定義一個函式(方法),與一般函式定義不同,類方法必須包含引數self,且為第一個引數! 此外,可使用**kw定義關鍵引數,代表任意引數,python函式可變引數及關鍵字引數定義參考見下文。
python函式只能先定義再呼叫!
4)self引數含義 在類的程式碼(函式)中,需要訪問當前的例項中的變數和函式的,即,訪問Instance中的: 對應的變數(property):Instance.ProperyNam,去讀取之前的值和寫入新的值 呼叫對應函式(function):Instance.function(),即執行對應的動作 此處的Instance本身就是self。
Python中的self等價於C++中的self指標和Java、C#中的this引數。
5)一個簡單例項
5.1程式碼如下
classperson():
def__init__(self,name,gender,birth,**kw):
self.name=name
self.gender=gender
self.birth=birth
fork,winkw.iteritems():
setattr(self,k,w)
defsayhi(self):
print'mynameis',self.name
xiaoming=person('XiaoMing','Male','1991-1-1',job='student',tel='18089355',stdid='15010')
xiaohong=person('XiaoHong','Female','1992-2-2')
printxiaoming.name
printxiaohong.birth
printxiaoming.job
printxiaoming.tel
printxiaoming.stdid
printxiaoming.sayhi()
5.2執行結果
XiaoMing
1992-2-2
student
18089355
15010
mynameisXiaoMing
None
5.3例項解釋 在本例中建立一個person的類,並賦值了兩個例項:xiaoming和xiaohong,self指的是傳入的例項(不同例項類的屬性值不同以及方法執行結果不同)即xiaoming和xiaohong,類的屬性即為name,gender,birth及其他kw,類的方法即為sayhi。
有關關鍵字引數請參考python的可變引數和關鍵字引數(*args**kw)
6)python中self和__init__的含義+為何要有self和__init__
在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的錯誤:
#!/usr/bin/python
#-*-coding:utf-8-*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中:self和init__的含義+為何要有self和__init__
https://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="wholeglobalname";
classPerson:
def__init__(self,newPersionName):
#self.name=newPersionName;
#1.如果此處不寫成self.name
#那麼此處的name,只是__init__函式中的區域性臨時變數name而已
#和全域性中的name,沒有半毛錢關係
name=newPersionName;
#此處只是為了程式碼演示,而使用了局部變數name,
#不過需要注意的是,此處很明顯,由於接下來的程式碼也沒有利用到此處的區域性變數name
#則就導致了,此處的name變數,實際上被浪費了,根本沒有利用到
defsayYourName(self):
#此處由於找不到例項中的name變數,所以會報錯:
#AttributeError:Personinstancehasnoattribute'name'
print'Mynameis%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了。
相應的正確寫法的程式碼如下:
#!/usr/bin/python
#-*-coding:utf-8-*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中:self和init__的含義+為何要有self和__init__
https://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="wholeglobalname";
classPerson:
def__init__(self,newPersionName):
#此處正確的,通過訪問self.name的形式,實現了:
#1.給例項中,增加了name變數
#2.並且給name賦了初值,為newPersionName
self.name=newPersionName;
defsayYourName(self):
#此處由於開始正確的初始化了self物件,使得其中有了name變數,所以此處可以正確訪問了name值了,可以正確的輸出了:
#Mynameiscrifan
print'Mynameis%s'%(self.name);
defselfAndInitDemo():
persionInstance=Person("crifan");
persionInstance.sayYourName();
###############################################################################
if__name__=="__main__":
selfAndInitDemo();
在函式中,使用對應的變數,雖然程式碼是可以執行的,但是實際上卻是使用的,不是例項中的變數,有時候,雖然你寫的程式碼,可以執行,但是使用到的變數,由於沒有加self,實際上是用到的不是例項的變數,而是其他的變數。
此類問題,主要和Python中的變數的作用域有關,但是此處例子中,也和是否使用self有關:
#!/usr/bin/python
#-*-coding:utf-8-*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中:self和init__的含義+為何要有self和__init__
https://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="wholeglobalname";
classPerson:
name="classglobalname"
def__init__(self,newPersionName):
#self.name=newPersionName;
#此處,沒有使用self.name
#而使得此處的name,實際上仍是區域性變數name
#雖然此處賦值了,但是後面沒有被利用到,屬於被浪費了的區域性變數name
name=newPersionName;
defsayYourName(self):
#此處,之所以沒有像之前一樣出現:
#AttributeError:Personinstancehasnoattribute'name'
#那是因為,雖然當前的例項self中,沒有在__init__中初始化對應的name變數,例項self中沒有對應的name變數
#但是由於例項所對應的類Person,有對應的name變數,所以也是可以正常執行程式碼的
#對應的,此處的self.name,實際上是Person.name
print'Mynameis%s'%(self.name);#->classglobalname
print'namewithinclassPersonisactuallytheglobalname:%s'%(name);#->wholeglobalname
print"onlyaccessPerson'snameviaPerson.name=%s"%(Person.name);#->classglobalname
defselfAndInitDemo():
persionInstance=Person("crifan");
persionInstance.sayYourName();
print"wholeglobalnameis%s"%(name);#->wholeglobalname
###############################################################################
if__name__=="__main__":
selfAndInitDemo();
其中,可見,此處開始__init__中,沒有給self例項初始化對應的name而後面的函式sayYourName中,雖然可以呼叫到self.name而沒有出現AttributeError錯誤,但是實際上此處的值,不是所期望的,傳入的name,即"crifan",而是類中的name的值,即"classglobalname"。
關於Python中變數的作用域的詳細解釋,可參考:
【整理】Python中變數的作用域(variablescope)
Python中的__init__
Python中,常會看到,很多類中,都有一個__init__函式。
下面就來解釋一下,__init__的含義。
Python中__init__的含義
首先來看init單詞本身,其含義是初始化。
而__init__的含義,也如同其單詞本意一樣,用來初始化。
但是給誰初始化呢?
很明顯,是給對應的類Class本身,去初始化。
Python中為何要有__init__
我的理解是,__init__的出現,主要有兩方面的作用:
一般常見的初始化,我的理解,可能主要有兩方面:
支援帶引數的類的初始化
這個用法,感覺就像,其他語言中的,對於Class初始化時,可以執行傳遞不同的引數一樣;
用程式碼演示如下:
#!/usr/bin/python
#-*-coding:utf-8-*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中:self和init__的含義+為何要有self和__init__
https://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,設定不同的人名(Personname)
self.name=newPersionName;
defsayYourName(self):
#不同的Person的示例,呼叫同樣的方法的時候,說出自己的名字,結果都是對應著自己的,各自不同的名字
print'Mynameis%s'%(self.name);#Mynameiscrifan
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__andselfwhatdotheydo?
【轉載自】https://blog.csdn.net/Goldxwang/article/details/84475773
python爬蟲學習系列
«上一篇
mongodb的使用者登入認證和基本使用下一篇»
相關推薦
Python類class中__init__函式以及引數self
1)class類包含:
類的屬性:類中所涉及的變數 類的方法:類中函式
2)_init_函式(方法)
1....
python類class中_init_函式以及引數self的簡單解釋
1)class類包含:
類的屬性:類中所涉及的變數
類的方法:類中函式
2)_init_函式(方法)
...
python建立函式以及引數的使用(一)
建立函式:
函式是可以呼叫的(可能帶有引數,也就是放在圓括號中的值),它執行某種行為並且返回一個值。
一般來說,內建的callable函式可以用來判...
PL/SQL過程和函式以及引數
PL/SQL過程和函式
PL/SQL中過程和函式設計的目的就是為了將程式碼模組化,有效的管理程式碼。
...
python中的函式,以及函式的可變引數,遞迴函式和高階函式以及練習題目
函式作用:實現程式碼的複用
函式概念:函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。
函式能提高應用的模...
mybatis中的mapper介面檔案以及example類的例項函式以及詳解
##Exampleexample=new##Example();
example.setOrde...
Python__Day04集合和函式,以及前面的變數總結
資料型別
有:
字串(str)
數字(int)
列表(list)
元組(tuple)
字典(dict)
不可變型...
matlab中dir函式以及sort函式的用法
dir函式的作用:返回當前路徑中的所有檔案以及資料夾所組成的列表。
dir%returnsalistoffiles...
[收集]c++抽象類、純虛擬函式以及巧用純虛解構函式實現介面類
在Java、C#中有關鍵詞abstract指明抽象函式、抽象類,但是在C++中沒有這個關鍵詞,很顯然,在C++也會需要只需要...
從0開始:getint()函式(類似於scanf函式)以及庫函式strncpy、strncat及strncmp函式的實現
程式一:編寫getint(int*pn)函式
#include
延伸文章資訊
- 1python 物件導向疑問 - iT 邦幫忙
EX num=7, 7就是一個物件那麼它的屬性是指甚麼呢? class Person(): def __init__(self,name): self.name=name. 在新建一個類別的時候...
- 2[Python] CLASS(類別) + __init__ 用法
[Python] CLASS(類別) + __init__ 用法 ... Python 是一種物件導向(OOP,object oriented programming)語言,在 python裡面...
- 3__init__ in Python - GeeksforGeeks
The Default __init__ Constructor in C++ and Java. Constructors are used to initializing the objec...
- 4Python 入門指南- 單元11 - __init__() 方法 - 程式語言教學誌
- 5關於Python的類別(Class)...基本篇 - 張凱喬
在python裡,就是用class 開宗明義定義一個類別名稱通常會用首字大寫的單字. 簡單範例1:建立基本屬性 class Animal(): def __init__(self, name):