2012-02-15 54 views
4

我想我已經在Python「類」和「繼承」的使用的一些誤解,我會簡化我的問題情況如下:的Python:變量,繼承和默認參數

class A: 
    def __init__(self): 
     self.data = 100 

class B(A): 
    def b(self): 
     print self.data 

>>>B().b() 
>>>100 

OK ,到目前爲止好不過,如果我創建另一個類,不順心的事,這是顯示如下:

class C(A): 
    def c(self, num=self.data): 
     print self.data 

>>>C().c() 
NameError: name 'self' is not defined 

我想成立「民」來self.data的默認值,這是'100'。沒有'class',它會簡單得多:

data = 100 
def d(num = data): 
    print num 

>>>d() 
>>>100 

我已經使用了一些文章,但仍然陷入這個問題... 在此先感謝!

回答

9

當你這樣做:

class C(A): 
    def c(self, num=self.data): 
     print self.data 

你正在做這樣的事情:

>>> def d(num, data=num): 
...  print(num, data) 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'num' is not defined 

正如你看到蟒蛇編譯器不知道第二num是什麼。

但沒有什麼東西做這樣的事情阻止你:

class C(A): 
    def c(self, num=None): 
     print num or self.data 

或有明確的None檢查:

class C(A): 
    def c(self, num=None): 
     if num is None: 
      num = self.data 
     print num 
+0

太棒了!對此,我真的非常感激!這正是我想要的!謝謝! – amigcamel 2012-02-15 14:26:14

0

你誤會類的方法。類方法隱式傳遞給self。自我不存在def c(self, num=HERE>>>>>self<<<<<HERE.data):

爲什麼你想要做你正在做的事情?

2

功能參數默認值是在定義函數時進行評估的,而不是對它的調用。在定義時間,沒有名稱self

最好的辦法是使用無作爲默認,然後用邏輯函數來解釋這意味着什麼:

class C(A): 
    def c(self, num=None): 
     if num is None: 
      num = self.data 
     #.. the rest of the function .. 
3

這有什麼好做的繼承。您可以嘗試在基類A中執行相同的操作,並且會以相同的方式失敗。

爲了實現你想要什麼簡單的事:

def c(self, num=None): 
    if num is None: 
     num = self.data 
+0

是的,你是對的!非常感謝! – amigcamel 2012-02-15 14:33:10

0
class C(A): 
    def c(self,data=None): 
     if data == None: 
      print self.data 
     else 
      print data 

類的方法來獲取參數, 你不能通過self.something。

0

如前所述,您不能使用像'self'這樣的變量。如果您以後不必更改數據的值,則可以執行以下操作:

class A: 
    data = 100 

class C(A): 
    def me(self, num=A.data): 
     print num