欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Python中的self用法詳解

系統 1625 0

在Python類中規定,函數的第一個參數是實例對象本身,并且約定俗成,把其名字寫為self。其作用相當于java中的this,表示當前類的對象,可以調用當前類中的屬性和方法。

class是面向對象的設計思想,instance(也即是 object,對象)是根據 class 創建的。

一個類(class)應該包含數據和操作數據的方法,通俗來講就是屬性和函數(即調用方法)。

類 class 中為啥用使用 self ?

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

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

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

  • -> 而需要訪問實例的變量和調用實例的函數,當然需要對應的實例Instance對象本身。
  • -> 而Python中就規定好了,函數的第一個參數,就必須是實例對象本身,并且建議,約定俗成,把其名字寫為self。
  • -> 所以,我們需要self(需要用到self)。

首先,在Python中類的定義:

在python中,類是通過關鍵字 class 定義的:

class 后面緊跟類名,即 Person,類名通常大寫字母開頭,緊接著是(object),表示該類是從哪個類繼承下來的,通常,如果沒有合適的 繼承類,就使用 object 類,這是所有類最終都會繼承的類。

            
class Person(object):  
pass
          

將 Person類實例化,創建實例化是通過 類名+() 實現的。

            
class Person(object):  
pass
student = Person()  # 創建類的實例化
print(student)
print(Person)
          

Python中的self用法詳解_第1張圖片

可以看到,變量 student 指向的就是一個 Person的 object,后面的 0x0000026EE434D8D0 是內存地址,每個 object 的地址都不一樣,而 Person 本身則是一個類。

也可以給實例變量綁定屬性,比如:為 student 綁定 name 和 score 屬性

            
class Person(object):  
pass
student = Person()
# print(student)
# print(Person)
student.name = "Gavin"   # 為實例變量 
student 綁定 name 屬性  類似于 賦值 操作
student.score = 100    # 為 其綁定 
score 屬性
print(student.name)p
rint(student.score)
          

Python中的self用法詳解_第2張圖片

上述的方法雖然可以為類的實例變量綁定屬性,但是不夠方便和elegant , 由于類 可以起到模板的作用,故在創建實例的時候,可以將我們認為必須綁定 屬性 強制填寫進去,在python中,是通過 類中通常都會使用的一個方法,即def __init__(self) 方法,在創建實例變量的時候,就把 name 和 score 等屬性綁上去。

            
class Person(object):  
def __init__(self,name,score):    
self.name = name    
self.score = score    
student = Person('Gavin',100)  # 傳入 __init__ 方法中需要的參數
print(student.name)
print(student.score)
          

Python中的self用法詳解_第3張圖片

傳入空參數的情況,會報錯:

            
class Person(object):  
def __init__(self,name,score):    
self.name = name    
self.score = score    
student = Person()   # 此處應該有參數傳入,卻沒有傳
print(student.name)
print(student.score)
          

Python中的self用法詳解_第4張圖片

注意:

1、__init__ 方法的第一個參數永遠是 self ,表示創建的實例本身,因此,在 __init__ 方法的內部,就可以把各種屬性綁定到 self,因為 self 就指向創建的實例本身。

2、使用了 __init__ 方法,在創建實例的時候就不能傳入 空的參數了,必須傳入與 __init__ 方法匹配的參數,但是 self 不需要傳,python解釋器會自己把實例變量傳進去。

在類中定義多個函數相互調用

            
class Person(object):  
def __init__(self,x,y):    
self.x = x    
self.y = y      
def add(self):    
sum = self.x + self.y    
return sum    
def square(self):    
squr = pow(self.x,2)+pow(self.y,2)    
return squr  
def add_square(self):    
c = self.add()+self.square()    
return c    
student = Person(3,4)print(student.add())
print(student.square())
print('--------- 我是可愛的分割線-----------')
print(student.add_square())
          

Python中的self用法詳解_第5張圖片

通過上述的例子可以看出,與普通的函數相比,在類中定義的函數只有兩點不同:

1、第一個參數永遠是 self ,并且調用時不用傳遞該參數

2、在類中函數相互調用要加 self ,如上例中: c = self.add()+self.square(), 不加 self ,會報錯: 函數未定義,看下圖:

Python中的self用法詳解_第6張圖片

除此之外,類的方法和普通函數沒甚區別,當然也可以使用 默認參數、可變參數和關鍵字參數,例子如下:

            
class Person(object):  
def __init__(self,x,y):    
self.x = x    
self.y = y          
def add(self,z=16):     # 設置 默認變量 z =16,這只是個普通的局部變量,非實例變量,實例變量需要   
self.z = z,這樣定義    
sum = self.x + self.y + z    
return sum    
def square(self):    
squr = pow(self.x,2)+pow(self.y,2)    
return squr  
def add_square(self,z):    # 調用時傳入變量,這也是個普通的局部變量,非實例變量     
c = self.add()+self.square() + z    
return c    
 student = Person(3,4)
print(student.add())
print(student.square())
print('--------- 我是可愛的分割線-----------')
print(student.add_square(16))
          

Python中的self用法詳解_第7張圖片

看了上述的例子可能還是不明白 self 到底是個什么鬼,為啥要使用 self 這鬼東西?沒關系,往下看:

其實 self 這家伙簡單的說就是把 class 中 定義的 變量和函數 變成 實例變量和實例函數,作為類 class 的成員,使得成員間能互相調用,而不需要從外部調用 數據(變量)和 方法(函數),以實現數據的封裝,以上面的 Person 類為例:

創建實例的時候需要給出實例變量 x,y, 調用函數時給出 z ,調用很容易,卻不知道內部實現的細節。

總之,類是創建實例的模板,而實例則是一個一個具體的對象,各個實例擁有的數據都相互獨立、互不影響;方法是與實例綁定的函數,和普通的函數不同,方法可以直接訪問實例的數據。

其實 self 中存儲的是實例變量和實例函數的屬性,可以理解為一個字典( dict ),如:{'name':'zhang','age':'18'}就是這些。

注意只有數據屬性,并沒有創建新的類的方法。 類----->通過實例化生成----對象---->(對象只是一串類似于字典的數據,沒有把類的里的方法復制給你,python沒有new這個方法!)

            
class Person(object):  
def __init__(self,x,y):    
self.x = x    
self.y = y          
def add(self,z=16):   # 設置 z 為實例變量,即 
self.z = z, z 是 class 的一個成員了,而非普通局部變量    
self.z = z    
sum = self.x + self.y + z # z雖然已被實例化,但是依然可以當作 普通變量來用    r
eturn sum    
def square(self):    
squr = pow(self.x,2)+pow(self.y,2)    
return squr  
def add_square(self):        
c = self.add()+self.square() + self.z # 調用實例變量 z     
return c    
student = Person(3,4)
print(student.add())
print(student.square())
print('--------- 我是可愛的分割線-----------')
print(student.add_square())
print(student.z)     # 函數add 中的 z 被實例化以后,就可以利用實例化的方法訪問它
          

Python中的self用法詳解_第8張圖片

通過這個例子可以看出, z 本來是 add() 函數的默認形參,通過將其實例化,就可以在其他函數體內調用實例變量z

被實例化以后,就可以利用實例化的方法訪問它。

那么 self 到底是什么?

            
class Box(object):

  def __init__(self, boxname, size, color):

    self.boxname = boxname

    self.size = size

    self.color = color # self就是用于存儲對象屬性的集合,就算沒有屬性self也是必備的

 

  def open(self, myself):

    print('-->用自己的myself,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname))

    print('-->用類自己的self,打開那個%s,%s的%s' % (self.color, self.size, self.boxname))

 

  def close(self):

    print('-->關閉%s,謝謝' % self.boxname)

 

 

b = Box('魔盒', '14m', '紅色')

b.close()

b.open(b) # 本來就會自動傳一個self,現在傳入b,就會讓open多得到一個實例對象本身,print看看是什么。

print(b.__dict__) # 這里返回的就是self本身,self存儲屬性,沒有動作。
          

Python中的self用法詳解_第9張圖片

self代表類的實例,而非類;self 就是 對象/實例 屬性集合

Box 是個類-----》self 實例化------》 b對象/ 實例

class 抽象體------》實例化------》對象/實例,含有屬性:{'boxname':'魔盒', ‘size':‘14m', 'color':'red'},即 self

self 看似是整個對象,實際上清楚地描述了類就是產生對象的過程,描述了 self 就是得到了 對象,所以 self 內的鍵值可以直接使用

正如自然界中一個有效的對象,必須包括:

1、描述對象的屬性;2、對象的方法

所以 self是必須的,也是對象中重要的特性。

看下面的代碼,感覺就更神奇了:

            
class Box(object):

  def myInit(mySelf, boxname, size, color):

    mySelf.boxname = boxname

    mySelf.size = size

    mySelf.color = color # 自己寫一個初始化函數,一樣奏效,甚至不用self命名。其它函數當中用標準self

    return mySelf # 返回給實例化過程一個對象!神奇!并且含有對象屬性/字典

 

  # def __init__(self, boxname, size, color):

  #   self.boxname = boxname

  #   self.size = size

  #   self.color = color #注釋掉原來標準的初始化

 

  def open(self, myself):

    print(self)

    print('-->用自己的myself,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname))

    print('-->用類自己的self,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname))

 

  def close(self):

    print('-->關閉%s,謝謝' % self.boxname)

 

 

# 經過改造,運行結果和標準初始化沒區別

 

b = Box().myInit('魔盒', '14m', '紅色')

# b = Box('魔盒', '14m', '紅色')#注釋掉原來標準的初始化方法

b.close()

b.open(b) # 本來就會自動傳一個self,現在傳入b,就會讓open多得到一個實例對象本身,print看看是什么。

print(b.__dict__) # 這里返回的就是self本身,self存儲屬性,沒有動作。
          

Python中的self用法詳解_第10張圖片

換個角度來講,對類的操作有:

1、定義屬性 ; 2、調用方法

對類的反饋有:

1、得到屬性 ; 2、執行方法

在 class 類的函數中,為什么 self是必要的,因為 self 是對象的載體,可以理解成一個字典,看下面代碼:

            
class Box(object):

  def myInit(mySelf, boxname, size, color):

    print(mySelf.__dict__)#顯示為{}空字典

    mySelf.boxname = boxname

    mySelf.__dict__['aa'] = 'w'#甚至可以像字典一樣操作

    mySelf.size = size

    mySelf.color = color # 自己寫一個初始化函數,一樣奏效,甚至不用self命名。其它函數當中用標準self

    return mySelf # 返回給實例化過程一個對象!神奇!并且含有對象屬性/字典

 

  # def __init__(self, boxname, size, color):

  #   self.boxname = boxname

  #   self.size = size

  #   self.color = color #注釋掉原來標準的初始化

 

  def open(self, myself):

    print(self)

    print('-->用自己的myself,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname))

    print('-->用類自己的self,打開那個%s,%s的%s' % (myself.color, myself.size, myself.boxname))

 

  def close(self):

    print('-->關閉%s,謝謝' % self.boxname)

 

 

# 經過改造,運行結果和標準初始化沒區別

 

b = Box().myInit('魔盒', '14m', '紅色')

# b = Box('魔盒', '14m', '紅色')#注釋掉原來標準的初始化方法

b.close()

b.open(b) # 本來就會自動傳一個self,現在傳入b,就會讓open多得到一個實例對象本身,print看看是什么。

print(b.__dict__) # 這里返回的就是self本身,self存儲屬性,沒有動作。
          

Python中的self用法詳解_第11張圖片

注意此處的: mySelf.__dict__['aa'] = 'w' #甚至可以像字典一樣操作; 在 b.__dict__ 的結果中顯示為:'aa':'w'

故可以把 self 理解成存儲 實例化對象屬性的字典(dict), self 存儲屬性,而沒有動作執行。

self總是指調用時的類的實例。

python 中一些特殊的實例變量:

1、私有變量(private),只有內部可以訪問,外部不能訪問,私有變量是在名稱前以兩個下劃線開頭,如:__name,其實私有變量也不是完全不能被外部訪問,不能直接訪問是因為python解釋器對外把 __name 變量改成了 _類名__name,所仍然可以通過 _類名__name 來訪問 __name。

2、在Python中,變量名類似__xxx__的,也就是以雙下劃線開頭,并且以雙下劃線結尾的,是特殊變量,特殊變量是可以直接訪問的,不是private變量,所以,不能用__name__、__score__這樣的變量名。

3、以一個下劃線開頭的實例變量名,比如_name,這樣的實例變量外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變量,不要隨意訪問”。

以上就是一文讀懂Python中的self的詳細內容,更多請關注腳本之家其它相關文章!


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线中文字幕日韩 | 网红和老师啪啪对白清晰 | 啪啪小视频 | 99这里只有精品视频 | 午夜免费| 在线看色片 | 国产精品18| 欧美日韩精品久久久免费观看 | 久久草在线视频 | 精品国产视频 | 久草欧美视频 | 精品久久洲久久久久护士免费 | 91亚洲一区 | 色噜噜狠狠先锋影音久久 | 欧美日韩在线视频播放 | 日本亚洲精品色婷婷在线影院 | 日本理论片好看理论片 | 爱爱视频天天干 | 夫妻性生活交换 | 亚洲国产最新 | 久草免费资源视频 | 奇米四色在线观看 | 午夜视频吧| 日韩免费一区二区 | 免费一级片在线观看 | 午夜大片 | 97超级碰碰碰碰在线视频 | 香蕉啪| 精品国产18久久久久久二百 | 伊人影院综合 | 99精品国产一区二区青青牛奶 | 99极品视频| 亚洲日韩视频免费观看 | 夜干夜夜 | 天堂中文资源在线8 | 久久久久久9 | 三级特黄 | 一区二区三区免费视频 www | 成人蜜桃av | 九九热综合 | 久久伊人免费视频 |