2012-02-15 55 views
4

我想我已经在Python“类”和“继承”的使用的一些误解,我会简化我的问题情况如下:的Python:变量,继承和默认参数

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

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

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

OK ,到目前为止好不过,如果我创建另一个类,不顺心的事,这是显示如下:

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

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

我想成立“民”来self.data的默认值,这是'100'。没有'class',它会简单得多:

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

>>>d() 
>>>100 

我已经使用了一些文章,但仍然陷入这个问题... 在此先感谢!

回答

9

当你这样做:

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 

正如你看到蟒蛇编译器不知道第二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 
+0

太棒了!对此,我真的非常感激!这正是我想要的!谢谢! – amigcamel 2012-02-15 14:26:14

0

你误会类的方法。类方法隐式传递给self。自我不存在def c(self, num=HERE>>>>>self<<<<<HERE.data):

为什么你想要做你正在做的事情?

2

功能参数默认值是在定义函数时进行评估的,而不是对它的调用。在定义时间,没有名称self

最好的办法是使用无作为默认,然后用逻辑函数来解释这意味着什么:

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 
+0

是的,你是对的!非常感谢! – amigcamel 2012-02-15 14:33:10

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

类的方法来获取参数, 你不能通过self.something。

0

如前所述,您不能使用像'self'这样的变量。如果您以后不必更改数据的值,则可以执行以下操作:

class A: 
    data = 100 

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