我认为我对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
我已经搜索了一些文章,但仍然坚持这个问题...... 提前谢谢!
答案 0 :(得分:10)
执行此操作时:
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
答案 1 :(得分:3)
这与继承无关。您可以尝试在基类A
中执行相同操作,但它会以相同的方式失败。
为了达到你想要的目的,只需:
def c(self, num=None):
if num is None:
num = self.data
答案 2 :(得分:2)
函数参数默认值在定义函数时计算,而不是在调用函数时计算。在定义时,没有名称self
。
最好的方法是使用None作为默认值,然后在函数中使用逻辑来解释这意味着什么:
class C(A):
def c(self, num=None):
if num is None:
num = self.data
#.. the rest of the function ..
答案 3 :(得分:0)
你误解了类方法。类方法是隐式传递给自己的。自我不存在def c(self, num=HERE>>>>>self<<<<<HERE.data):
你为什么要做你正在做的事情?
答案 4 :(得分:0)
class C(A):
def c(self,data=None):
if data == None:
print self.data
else
print data
你的类的方法得到参数, 你无法通过自我。
答案 5 :(得分:0)
如前所述,你不能像这样使用'self'变量。如果以后不必更改数据值,可以执行以下操作:
class A:
data = 100
class C(A):
def me(self, num=A.data):
print num