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

歡迎訪問 生活随笔!

生活随笔

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

python

python的self

發布時間:2024/4/13 python 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python的self 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考原文鏈接:https://blog.csdn.net/xrinosvip/article/details/89647884

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

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

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

類 class 中為啥用使用 self ?

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

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

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

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

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

-> 所以,我們需要self

首先,在Python中類的定義:

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

class Personobject:pass

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

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


可以看到,變量 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) print(student.score)


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

class Person(object):def __init__(self,name,score):self.name = nameself.score = scorestudent = Person('Gavin',100)#傳入 __init__ 方法中需要的 參數student = Person()# 此處應該有參數傳入,卻沒有傳 這樣會報錯 print(student.name) print(student.score)


注意:

  • 1、init 方法的第一個參數永遠是 self ,表示創建的實例本身,因此,在 __init__ 方法的內部,就可以把各種屬性綁定到 self,如def __init__(self,name,score):
  • 2、使用了 init 方法,在創建實例的時候就不能傳入 空的參數了,必須傳入與 __init__ 方法匹配的參數,但是 self不需要傳,python解釋器會自己把實例變量傳進去

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

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

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

  • 1、第一個參數永遠是 self ,并且調用時不用傳遞該參數
  • 2、在類中函數相互調用要加 self ,如上例中:c = self.add()+self.square()`, 不加 self ,會報錯:
    函數未定義,看下圖

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


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

z 本來是 add() 函數的默認形參,通過將其實例化,就可以在其他函數體內調用 實例變量 z 被實例化以后,就可以利用實例化的方法訪問它

self 到底是什么?

class Box(object):def __init__(self, boxname, size, color):self.boxname = boxnameself.size = sizeself.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存儲屬性,沒有動作。`

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

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

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

描述了 self 就是得到了 對象,所以 self 內的鍵值可以直接使用

class Box(object):def myInit(mySelf, boxname, size, color):print(mySelf.__dict__)#顯示為{}空字典mySelf.boxname = boxnamemySelf.__dict__['aa'] = 'w'#甚至可以像字典一樣操作mySelf.size = sizemySelf.color = color # 自己寫一個初始化函數,一樣奏效,甚至不用self命名。其它函數當中用標準selfreturn 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存儲屬性,沒有動作。


自定義的myInit()和__init__()初始化的差別:

  • b = Box().myInit(‘魔盒’, ‘14m’, ‘紅色’)

  • b = Box(‘魔盒’, ‘14m’, ‘紅色’)#原來的初始化方法

注意

  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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