一、self
1、含義
類的方法與普通的函數(shù)只有一個(gè)特別的區(qū)別?——?它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱,但是在調(diào)用這個(gè)方法的時(shí)候你不為這個(gè)參數(shù)賦值,?Python?會(huì)提供這個(gè)值。這個(gè)特別的變量指對(duì)象本身,按照慣例它的名稱是?self。
--- 摘自《A Byte of Python3(中文版)》
? ?在類方法中,按慣例第一個(gè)第一個(gè)參數(shù)通常都稱為self,這個(gè)參數(shù)給方法提供一個(gè)鉤子,從而返回調(diào)用的主體,也就是實(shí)例對(duì)象:因?yàn)轭惪梢援a(chǎn)生許多實(shí)例對(duì)象,所以需要這個(gè)參數(shù)來(lái)管理每個(gè)實(shí)例彼此不同的的數(shù)據(jù)。 ?
--- 摘自《Python學(xué)習(xí)手冊(cè)第3版》
通過(guò)上面2段描述可以把self簡(jiǎn)單理解為實(shí)例本身,一般對(duì)類進(jìn)行實(shí)例化得到一個(gè)實(shí)例對(duì)象后,通過(guò)點(diǎn)記法來(lái)調(diào)用類中的方法,如下
Object.method(arg1, arg2)
等價(jià)于
Class.method(Object, arg1, arg2)
? ?self就是指Object
2、例子
def sub(a,b):
print("this outside sub")
return a-b
class MyOperation:
def sub(self,a,b):
print("this inner sub")
return a-b
def mix(self,a,b):
print(self.sub(a,b))
print(sub(a,b))
r=MyOperation() #得到一個(gè)MyOperation類的實(shí)例
t=r.mix(5,8) #調(diào)用類里面的方法,此處等價(jià)于MyOperation.mix(r,5,8)
?
Notes:
(1)?為了達(dá)到能夠通過(guò)實(shí)例來(lái)調(diào)用類中方法的目的,每個(gè)方法都必須有一個(gè)self參數(shù) (這也是類方法和普通函數(shù)的區(qū)別) 。
(2)在mix()方法中通過(guò)self調(diào)用的是類里面定義的sub(),否則是調(diào)用的類外面的函數(shù)sub()。
?
二、__init__()方法
1. 不用 init ()方法定義類
定義一個(gè)三角形的類,目的是求周長(zhǎng)和面積。
import math
class Triangle():
def getPeri(self,a,b,c):
return a+b+c
def getArea(self,a,b,c):
p=(a+b+c)/2
return math.sqrt(p*(p-a)*(p-b)*(p-c))
tri = Triangle()
print(tri.getPeri(3,4,5))
print(tri.getArea(3,4,5))
print(tri.__dict__)
# 輸出結(jié)果:12 6.0 {}
從上例中可以看到,在類中并沒(méi)有定義init()方法,但是也能夠得到類似的要求,結(jié)果返回了三角形實(shí)例tri的周長(zhǎng)及面積。?但是,我們通過(guò)print(tri.dict)來(lái)看這個(gè)實(shí)例的屬性,竟然是空的,我們定義了一個(gè)三角形,按理來(lái)說(shuō)它的屬性應(yīng)該是它的三邊。但是它竟然沒(méi)有。這就是沒(méi)有定義init()的原因了。并且,在實(shí)例化對(duì)象的時(shí)候,tri?= Triangle()參數(shù)為空,沒(méi)有指定a、b、c的值,只有在調(diào)用函數(shù)的時(shí)候才指定了。且類中定義的每個(gè)方法的參數(shù)都有a、b、c,這顯然浪費(fèi)感情,在類中直接指定方法就可以了。
因此,需要在類中定義init()方法,方便創(chuàng)建實(shí)例的時(shí)候,需要給實(shí)例綁定上屬性,也方便類中的方法(函數(shù))的定義。
?
2、用init()方法定義類?
上述同樣的例子,采用init()方法定義類,如下:
import math
class Triangle():
def __init__(self,a,b,c):
self.a=a
self.b=b
self.c=c
def getPeri(self):
return self.a+self.b+self.c
def getArea(self):
p=(self.a+self.b+self.c)/2
return math.sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
tri = Triangle(3,4,5)
print(tri.getPeri())
print(tri.getArea())
print(tri.__dict__)
# 輸出結(jié)果:12 6.0 {'a': 3, 'b': 4, 'c': 5}
?定義完 init ()后,創(chuàng)建的每個(gè)實(shí)例都有自己的屬性,也方便直接調(diào)用類中的函數(shù)。
?
參考文章:
1.?https://www.cnblogs.com/hanmk/p/9007689.html
2.?https://fishc.com.cn/thread-115047-1-1.html
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
