小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python中self的解釋

 liqualife 2019-07-14

定義

首先我們要搞明白Python的類中為要什么要用到self這個(gè)單詞呢,為什么不用'zhangsan'、'lisi'這樣的名字呢,這可定有他的用意。查Google翻譯解釋:

self
名詞的解釋:自;自我;自己

那么問(wèn)題來(lái)了,這里的自己指代的到底是誰(shuí),下面聽(tīng)我詳細(xì)分解。(僅屬于自己的見(jiàn)解,有不對(duì)的地方,還望不吝賜教)

分析

測(cè)試代碼以一下這個(gè)代碼及其它的擴(kuò)充為基礎(chǔ),先貼代碼,為了好理解,別說(shuō)了半天不知道我在說(shuō)什么。

class A(): def song(one): print(one) def sing(self,one): print(one)
  • 1
  • 2
  • 3
  • 4
  • 5
1、首先要搞清楚的一個(gè)問(wèn)題 a=A()與a=A,這兩個(gè)賦值之間的區(qū)別
a=A()print(a)a=Aprint(a)print(A)結(jié)果如下:<__main__.A object at 0x0000020A69C81780><class '__main__.A'><class '__main__.A'>分析:a=A()  是有地址的,這說(shuō)明他是一個(gè)實(shí)體,比如 int a  中的 a 一樣a=A    是沒(méi)有地址的,發(fā)現(xiàn)他和A打印的結(jié)果一毛一樣,這說(shuō)明他就是A,也就是一個(gè)類名,       等價(jià)于上一句中 int a 中的 int       那么也就是說(shuō)下面這兩語(yǔ)句是等價(jià)的b=A()   與   b=a()-------------------------------------------------------------------------通過(guò)上面的分析,我們知道,a=A()相當(dāng)于把 A 給實(shí)例化了,什么叫實(shí)例化呢,類比與 int a ,int 什么都不能做,即 int 不能被賦值,不能進(jìn)行算術(shù)操作等等,但是 a 可以(其實(shí)這里的 A 與 int是一樣的,追溯到C語(yǔ)言,類只不過(guò)是一種自定義的結(jié)構(gòu)變量而已,只不過(guò)功能更加強(qiáng)大)。那具體怎么個(gè)實(shí)例發(fā)呢?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
2、self 到底指代的是誰(shuí)
class A(): def song(one): print(one) def sing(self,one): print(one)a=A()A.sing(a,'hello') #注意這條語(yǔ)句a.sing('hello')打印結(jié)果:hellohello-------------------------------A.sing('hello')錯(cuò)誤信息:TypeError: sing() missing 1 required positional argument: 'one'提示沒(méi)有給 one 賦值--------------------------------a.song('hello')錯(cuò)誤信息:TypeError: song() takes 1 positional argument but 2 were given那么問(wèn)題來(lái)了,多給了一個(gè)什么參數(shù),為什么會(huì)多給呢?--------------------------------把類A改一下class A(): def song(one,two): #注意這里多給song了一個(gè)參數(shù) print(one)a.song('hello') //這里的參數(shù) 'hello'賦給了 twoprint(a)打印結(jié)果:<__main__.A object at 0x0000020A69C39CC0><__main__.A object at 0x0000020A69C39CC0>是不是很奇怪,為什么a.song('hello')返回的是 實(shí)例 a 的地址呢?
  • 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

從這個(gè)例子中你就可以發(fā)現(xiàn),實(shí)際上 a.sing(“hello”) 等價(jià)于 A.sing(a,“hello”),而self就是實(shí)例 a 自己,而且你發(fā)現(xiàn) self ,也可以用別的單詞來(lái)代替。
通過(guò)這段分析,我們簡(jiǎn)單的知道了,類中的方法第一個(gè)參數(shù)必須是 self ,不然實(shí)例無(wú)法正確調(diào)用類中的方法,也就是說(shuō),如果方法中第一個(gè)參數(shù)不是 self(廣義的),那么這個(gè)方法是沒(méi)有任何價(jià)值的,因?yàn)閷?shí)例無(wú)法調(diào)用它,一個(gè)無(wú)法被調(diào)用的方法真不知道有什么用。

參數(shù)前面的 self

x=6class A():    def sing(self):        self.x=10    def mutl(self):        y=10*x        print(y)a=A()  a.mutl()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

這里先猜一下結(jié)果,到底會(huì)打印 60 呢,還是 100 呢?要弄清這個(gè)問(wèn)題,就要先弄清 mutl() 中的 x 到底是哪一個(gè),先看結(jié)果在分析。
結(jié)果是:60
為什么不調(diào)用類內(nèi)部的 x 參數(shù)而跑去調(diào)用類外的 x 呢?還是那個(gè)問(wèn)題,self 到底指代的是誰(shuí),self 就是 a 本身,那么問(wèn)題就很明顯了,mutl() 方法中的 x 前面沒(méi)有加 self 所以他調(diào)用的不是實(shí)例(注意這里說(shuō)的是實(shí)例,而不是類)自身的參數(shù)。
到這里我想你大概明白了,參數(shù)前面有self和沒(méi)self的區(qū)別了,簡(jiǎn)單說(shuō),帶self的參數(shù)是人家實(shí)例自身的,不帶self的,愛(ài)誰(shuí)誰(shuí),實(shí)例不管。

不同方法中的參數(shù)是否可以互相使用

class A(): def mutl(self): x=5 def sing(self): y=5*x print(y)a=A() a.mutl()a.sing()錯(cuò)誤如下:<ipython-input-3-e305f6d63af0> in sing(self) 3 x=5 4 def sing(self):----> 5 y=5*x 6 print(y) 7 # def print1(self):NameError: name 'x' is not defined
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

可以看到,對(duì)于參數(shù)前面不加self的參數(shù),只適用于本方法,不能跨方法調(diào)用。


class A():    def mutl(self):        self.x=5    def sing(self):        y=5*self.x        print(y)a=A()  a.mutl()a.sing()打印結(jié)果:25
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

這里可以清晰地看到不在報(bào)錯(cuò),加了self,立馬實(shí)現(xiàn)跨方法調(diào)用。


class A(): def mutl(self): self.x=5 def sing(self): y=5*self.x print(y)a=A() a.sing()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

先思考一下這段代碼與上面的不同之處。
是不是這里沒(méi)有調(diào)用方法 a.mutl()呢,那結(jié)果是什么呢,思考一下。

<ipython-input-6-ddb67bd4703e> in sing(self)      3         self.x=5      4     def sing(self):----> 5         y=5*self.x      6         print(y)      7 AttributeError: 'A' object has no attribute 'x'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

顯示類中沒(méi)有參數(shù) x ,我什么呢,我明明定義了啊,對(duì)滴。但是在把類實(shí)例之后你沒(méi)有通過(guò)方法 a.mutl() 來(lái)實(shí)現(xiàn)對(duì) self.x 進(jìn)行定義。這也就是為什么要先有構(gòu)造函數(shù)了,先把所有類中的參數(shù)全部定義以后,你才能使用。

小結(jié)

其實(shí)說(shuō)了這么多,說(shuō)的也很亂,但是我想說(shuō)明的就兩點(diǎn):

  1. 類中的方法第一個(gè)參數(shù)是 self 的才可以被實(shí)例調(diào)用。
  2. 類中帶 self 的參數(shù)都是 實(shí)例 的,實(shí)例對(duì)這個(gè)參數(shù)擁有所有權(quán),即實(shí)例中所有的方法都可以使用實(shí)例的參數(shù)。

至于參數(shù)什么時(shí)候用加self什么時(shí)候不用加self,我想你只要弄白了self到底起什么作用,這個(gè)問(wèn)題就不說(shuō)自明了。

由于水平有限,分析中可能包含一些錯(cuò)誤,還望各位不吝賜教,多多海涵!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多