Python:变量、继承和默认参数

6 投票
6 回答
3846 浏览
提问于 2025-04-17 13:05

我觉得我对Python中的“类”和“继承”的用法有些误解。为了简单明了,我把问题简化成以下几点:

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'。如果没有'类',这会简单很多:

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

>>>d()
>>>100

我已经在网上查了一些文章,但还是卡在这个问题上……提前谢谢大家!

相关问题:

6 个回答

2

函数的参数默认值是在定义函数的时候就确定的,而不是在调用函数的时候才确定。定义函数时,并没有名为 self 的东西。

最好的做法是把默认值设置为 None,然后在函数内部用逻辑来判断这个值代表什么:

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
11

当你这样做的时候:

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

撰写回答