繁体   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