Python類中__init__()?和self的詳細(xì)解析
1、Python中self的含義
self,英文單詞意思很明顯,表示自己,本身。
此處有幾種潛在含義:
1.這里的自己,指的是,實(shí)例Instance本身。
2.同時, 由于說到“自己”這個詞,都是和相對而言的“其他”而說的;而此處的其他,指的是,類Class,和其他變量,比如局部變量,全局變量等。
此處的self,是個對象(Object),是當(dāng)前類的實(shí)例。
因此,對應(yīng)的self.valueName 和 self.function()中的valueName:表示self對象,即實(shí)例的變量。與其他的,Class的變量,全局的變量,局部的變量,是相對應(yīng)的。
function:表示是調(diào)用的是self對象,即實(shí)例的函數(shù)。與其他的全局的函數(shù),是相對應(yīng)的。
2、Python中為何要有self
那就是:
在類的代碼(函數(shù))中,需要訪問當(dāng)前的實(shí)例中的變量和函數(shù)的,即,訪問Instance中的:
對應(yīng)的變量(屬性,property):Instance.ProperyNam,去讀取之前的值和寫入新的值
調(diào)用對應(yīng)函數(shù)(function):Instance.function(),即執(zhí)行對應(yīng)的動作
-> 而需要訪問實(shí)例的變量和調(diào)用實(shí)例的函數(shù),當(dāng)然需要對應(yīng)的實(shí)例Instance對象本身
-> 而Python中就規(guī)定好了,函數(shù)的第一個參數(shù),就必須是實(shí)例對象本身,并且建議,約定俗成,把其名字寫為self
-> 所以,我們需要self(需要用到self)
而如果沒有用到self,即代碼中,去掉self后,那種寫法所使用到的變量,實(shí)際上不是你所希望的,不是真正的實(shí)例中的變量和函數(shù),而是的訪問到了其他部分的變量和函數(shù)了。甚至?xí)捎跊]有合適的初始化實(shí)例變量,而導(dǎo)致后續(xù)無法訪問的錯誤。
下面,就通過代碼,來演示,如果去掉self,或者沒有合理的使用self,會出現(xiàn)哪些錯誤。
3、首先來看一下__init__()和self對象
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies
class Person(object):
def __init__(self, name, lang, website):
self.name = name
self.lang = lang
self.website = website
print('self: ', self)
print('type of self: ', type(self))
'''
未實(shí)例化時,運(yùn)行程序,構(gòu)造方法沒有運(yùn)行
'''
p = Person('Tim', 'English', 'www.universal.com')
'''實(shí)例化后運(yùn)行的結(jié)果
self: <__main__.Person object at 0x00000000021EAF98>
type of self: <class '__main__.Person'>
'''可以看出self為實(shí)例變量p,是一個Person類型的對象。
class Dog(object):
def __init__(self,name,dog_type):
self.name = name
self.type = dog_type
def sayhi(self):
print("hello,I am a dog, my name is ",self.name)
d = Dog('LiChuang',"京巴") # 實(shí)例化
d.sayhi()
以下是d = Dog('LiChuang',"京巴")實(shí)例化的示意圖:

4、如果沒有在__init__中初始化對應(yīng)的實(shí)例變量的話,導(dǎo)致后續(xù)引用實(shí)例變量會出錯
如下代碼,完整的演示了,如果沒有在類Class的最初的__init__函數(shù)中,正確的初始化實(shí)例變量,則會導(dǎo)致后續(xù)沒有變量可用,因而出現(xiàn)AttributeError的錯誤:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實(shí)際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
'''
class Person(object):
def __init__(self, newPersonName):
# self.name = newPersonName
'''
如果此處不寫成self.name
那么此處的name,只是__init__函數(shù)中的局部臨時變量name而已
和全局中的name,沒有半毛錢關(guān)系
'''
name = newPersonName
'''
此處只是為了代碼演示,而使用了局部變量name,
不過需要注意的是,此處很明顯,由于接下來的代碼也沒有利用到此處的局部變量name
則就導(dǎo)致了,此處的name變量,實(shí)際上被浪費(fèi)了,根本沒有利用到
'''
def sayYourName(self):
'''
此處由于找不到實(shí)例中的name變量,所以會報錯:
AttributeError: Person instance has no attribute 'name'
'''
print('My name is %s' %self.name)
def selfAndInitDemo():
personInstance = Person('Tim')
personInstance.sayYourName()
if __name__ == '__main__':
selfAndInitDemo()
''' 未使用self.name時拋異常
Traceback (most recent call last):
File "E:/python14_workspace/s14/day06/test_1.py", line 18, in <module>
selfAndInitDemo()
File "E:/python14_workspace/s14/day06/test_1.py", line 15, in selfAndInitDemo
personInstance.sayYourName()
File "E:/python14_workspace/s14/day06/test_1.py", line 11, in sayYourName
print('My name is %s' %self.name)
AttributeError: 'Person' object has no attribute 'name'
'''從上述代碼可見,由于在類的初始化(實(shí)例化)的__init__函數(shù)中,沒有給self.name設(shè)置值,使得實(shí)例中,根本沒有name這個變量,導(dǎo)致后續(xù)再去訪問self.name,就會出現(xiàn)AttributeError的錯誤了。
對應(yīng)的,如果寫成self.name,則意思就正確了,就是初始化的時候,給實(shí)例中新增加,并且正常設(shè)置了正確的值newPersionName了,所以后續(xù)再去通過self.name,就可以訪問到,當(dāng)前實(shí)例中正確的變量name了。
相應(yīng)的正確寫法的代碼如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實(shí)際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
'''
class Person(object):
def __init__(self, newPersonName):
self.name = newPersonName
'''
此處正確的,通過訪問self.name的形式,實(shí)現(xiàn)了:
1.給實(shí)例中,增加了name變量
2.并且給name賦了初值,為newPersionName
'''
def sayYourName(self):
'''
此處由于開始正確的初始化了self對象,使得其中有了name變量,
所以此處可以正確訪問了name值了
'''
print('My name is %s' %self.name)
def selfAndInitDemo():
personInstance = Person('Tim')
personInstance.sayYourName()
if __name__ == '__main__':
selfAndInitDemo()
'''My name is Tim'''5、在函數(shù)中,使用對應(yīng)的變量,雖然代碼是可以運(yùn)行的,但是實(shí)際上卻是使用的,不是實(shí)例中的變量
有時候,雖然你寫的代碼,可以運(yùn)行,但是使用到的變量,由于沒有加self,實(shí)際上是用到的不是實(shí)例的變量,而是其他的變量。
此類問題,主要和Python中的變量的作用域有關(guān),但是此處例子中,也和是否使用self有關(guān):
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實(shí)際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
'''
class Person(object):
name = 'class global name'
def __init__(self, newPersonName):
# self.name = newPersonName
'''
此處,沒有使用self.name
而使得此處的name,實(shí)際上仍是局部變量name
雖然此處賦值了,但是后面沒有被利用到,屬于被浪費(fèi)了的局部變量name
'''
name = newPersonName
def sayYourName(self):
'''
此處,之所以沒有像之前一樣出現(xiàn):
AttributeError: Person instance has no attribute 'name'
那是因為,雖然當(dāng)前的實(shí)例self中,沒有在__init__中初始化對應(yīng)的name變量,實(shí)例self中沒有對應(yīng)的name變量
但是由于實(shí)例所對應(yīng)的類Person,有對應(yīng)的name變量,所以也是可以正常執(zhí)行代碼的
對應(yīng)的,此處的self.name,實(shí)際上是Person.name
'''
print('My name is %s' %self.name)
print('Name within class Person is actually the global name: %s' %name)
print("Only access Person's name via Person.name = %s" %(Person.name))
def selfAndInitDemo():
personInstance = Person('Tim')
personInstance.sayYourName()
print('whole global name is %s' %name)
if __name__ == '__main__':
selfAndInitDemo()
'''
My name is class global name
Name within class Person is actually the global name: whole global name
Only access Person's name via Person.name = class global name
whole global name is whole global name
'''其中,可見,此處開始__init__中,沒有給self實(shí)例初始化對應(yīng)的name,
而后面的函數(shù)sayYourName中,雖然可以調(diào)用到self.name而沒有出現(xiàn)AttributeError錯誤,
但是實(shí)際上此處的值,不是所期望的,傳入的name,即"Tim",而是類中的name的值,即"class global name"。
總結(jié)
到此這篇關(guān)于Python類中__init__() 和self解析的文章就介紹到這了,更多相關(guān)Python類__init__() 和self內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說明
這篇文章主要介紹了python print()函數(shù)的end參數(shù)和sep參數(shù)的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
Python自動化實(shí)現(xiàn)日報數(shù)據(jù)可視化
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)自動化生成日報數(shù)據(jù)可視化,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
python 通過麥克風(fēng)錄音 生成wav文件的方法
今天小編就為大家分享一篇python 通過麥克風(fēng)錄音 生成wav文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
在Ubuntu系統(tǒng)下安裝使用Python的GUI工具wxPython
這篇文章主要介紹了在Ubuntu系統(tǒng)下安裝使用Python的GUI工具wxPython的方法,wxPython可以為Python提供強(qiáng)大的圖形化界面開發(fā)支持,需要的朋友可以參考下2016-02-02
python實(shí)現(xiàn)讀取類別頻數(shù)數(shù)據(jù)畫水平條形圖案例
這篇文章主要介紹了python實(shí)現(xiàn)讀取類別頻數(shù)數(shù)據(jù)畫水平條形圖案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04

