5 回答

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
我將演示不使用類的代碼:
def state_init(state): state['field'] = 'init'def state_add(state, x): state['field'] += xdef state_mult(state, x): state['field'] *= xdef state_getField(state): return state['field']myself = {}state_init(myself)state_add(myself, 'added')state_mult(myself, 2)print( state_getField(myself) ) #--> 'initaddedinitadded'
類只是一種避免一直傳遞這種“狀態(tài)”的東西的方法(以及其他很好的東西,比如初始化,類組合,很少需要的元類,以及支持自定義方法來覆蓋運(yùn)算符)。
現(xiàn)在讓我們使用內(nèi)置的python類機(jī)器演示上面的代碼,以顯示它是如何基本相同的。
class State(object): def __init__(self): self.field = 'init' def add(self, x): self.field += x def mult(self, x): self.field *= x s = State()s.add('added') # self is implicitly passed ins.mult(2) # self is implicitly passed inprint( s.field )

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
您需要使用的原因self.
是因?yàn)镻ython不使用@
語法來引用實(shí)例屬性。Python的決定做方法的方式,使該實(shí)例該方法屬于可通過自動(dòng),但不接受自動(dòng):方法的第一個(gè)參數(shù)是實(shí)例的方法被調(diào)用。這使方法與函數(shù)完全相同,并留下實(shí)際名稱以供您使用(雖然self
是慣例,當(dāng)您使用其他東西時(shí),人們通常會(huì)對(duì)您不滿。)self
對(duì)代碼來說并不特殊,它只是另一個(gè)對(duì)象。
Python可以做其他事情來區(qū)分普通名稱和屬性 - 像Ruby這樣的特殊語法,或者需要像C ++和Java那樣的聲明,或者可能是更不同的東西 - 但它沒有。Python的所有內(nèi)容都是為了使事情變得明確,讓它顯而易見的是什么,雖然它并不是完全在任何地方完成,但它確實(shí)是為了實(shí)例屬性。這就是為什么分配一個(gè)實(shí)例屬性需要知道要分配的實(shí)例,這就是它需要的原因self.
。

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
我們來看一個(gè)簡(jiǎn)單的矢量類:
class Vector: def __init__(self, x, y): self.x = x self.y = y
我們想要一個(gè)計(jì)算長(zhǎng)度的方法。如果我們想在類中定義它會(huì)是什么樣子?
def length(self): return math.sqrt(self.x ** 2 + self.y ** 2)
當(dāng)我們將它定義為全局方法/函數(shù)時(shí),它應(yīng)該是什么樣子?
def length_global(vector): return math.sqrt(vector.x ** 2 + vector.y ** 2)
所以整個(gè)結(jié)構(gòu)保持不變。我怎么能利用這個(gè)呢?如果我們假設(shè)我們沒有length
為我們的Vector
類編寫方法,我們可以這樣做:
Vector.length_new = length_global v = Vector(3, 4)print(v.length_new()) # 5.0
這是因?yàn)榈谝粋€(gè)參數(shù)length_global
,可以重新用作self
參數(shù)length_new
。如果沒有明確的話,這是不可能的self
。
理解顯式需求的另一種方法self
是查看Python添加一些語法糖的位置。當(dāng)你記住,基本上,一個(gè)電話就像
v_instance.length()
內(nèi)部轉(zhuǎn)變?yōu)?/p>
Vector.length(v_instance)
很容易看到self
適合的位置。你實(shí)際上并沒有在Python中編寫實(shí)例方法; 你寫的是類方法,它必須將實(shí)例作為第一個(gè)參數(shù)。因此,您必須明確地將實(shí)例參數(shù)放在某處。

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
假設(shè)您有一個(gè)類ClassA
,其中包含一個(gè)methodA
定義為的方法:
def methodA(self, arg1, arg2): # do something
并且ObjectA
是這個(gè)類的一個(gè)實(shí)例。
現(xiàn)在ObjectA.methodA(arg1, arg2)
調(diào)用時(shí),python會(huì)在內(nèi)部將其轉(zhuǎn)換為:
ClassA.methodA(ObjectA, arg1, arg2)
的self
變量是指對(duì)象本身。
添加回答
舉報(bào)