Python:变量、继承和默认参数
我觉得我对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