簡體   English   中英

Python:變量,繼承和默認參數

[英]Python: variables, inheritance, and default arguments

我想我對Python中“class”和“inheritance”的使用有一些誤解。我將簡化我的問題如下:

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

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

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

好的,到目前為止一切順利。 但是,如果我創建另一個類,則會出現問題,如下所示:

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

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

我想將'num'的默認值設置為self.data,即'100'。 沒有'class',它會更簡單:

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

>>>d()
>>>100

我已經搜索了一些文章,但仍然堅持這個問題...提前謝謝!

當你這樣做:

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

正如您所看到的,python編譯器不知道第二個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

這與繼承無關。 您可以嘗試在基類A中執行相同操作,但它會以相同的方式失敗。

為了達到你想要的目的,只需:

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

函數參數默認值在定義函數時計算,而不是在調用函數時計算。 在定義時,沒有名稱self

最好的方法是使用None作為默認值,然后在函數中使用邏輯來解釋這意味着什么:

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

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

你為什么要做你正在做的事情?

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

你的類獲取參數的方法,你不能傳遞self.something。

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

class A:
    data = 100

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM