2013-03-06 60 views
0
class a: 
    def set(self, value): 
     print value+1 

    def set2(self, value): 
     self.set(value) 

class b(a):   
    def set(self, value): 
     print value 

if __name__ == '__main__': 
    i = b() 
    i.set2(10) 

執行時,我得到了導致爲10,這意味着,b.set()是所謂的,但爲什麼不a.set(),因爲它被稱爲與露骨selfPython的方法重寫規則

P.S. 因此,即使類'a'沒有方法set(),這個代碼仍然工作?但它是一個好的編碼規則?

+2

'self'實際上是一個b對象本身。 – 2013-03-06 09:22:36

+0

@avasal,但我沒有得到屬性錯誤 – j5shi 2013-03-06 09:24:46

+2

你看你是如何傳遞一個'b'對象?你會得到:''b''調用'set2',但它沒有調用''''set2',但你注意到'set2'怎麼調用'set'?使用'self.set(value)'。而且由於'self'是'b'類型,所以自然可以調用'b'''''。 – dmg 2013-03-06 09:25:21

回答

2

當你調用self.set(value),它總是給你同樣的定義set()不管你怎麼稱呼它。

class Animal(object): 
    def interact(self): 
     print('I am a {}, I say "{}"'.format(self.name(), self.speak())) 

class Dog(Animal): 
    def name(self): 
     return 'dog' 
    def speak(self): 
     return 'woof' 

如果需要,您可以明確調用a.set()

class A(object): 
    def set(self, value): 
     print(value + 1) 
    def set2(self, value): 
     A.set(self, value) 

但是,這有點愚蠢。這個例子太抽象了,你不能用它來找出好的編碼風格。

+1

那麼,動物的例子總是一個很好的例子:) – dmg 2013-03-06 09:26:21

3

您在派生類中重寫set(),這就是self.set()調用的內容。

要調用a的方法,你可以用下面的語法:

a.set(self, value) 
0

對於您的情況,如果您想要調用aset(),則需要使用以下語法。 a().set(10)