2012-02-15 2 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 

Я хочу, чтобы установить значение по умолчанию «» NUM к self.data, который «100». Без «класса» это будет намного проще:

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

0

Вы непонимание методов класса. Методы класса неявно передаются самостоятельно. Self не существует def c(self, num=HERE>>>>>self<<<<<HERE.data):

Почему вы хотите делать то, что вы делаете?

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

Да, вы правы! Большое спасибо! – amigcamel

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 
Смежные вопросы