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 

Я уже собирал некоторые статьи, но все еще застрял в этой проблеме … Спасибо заранее!

Когда вы это сделаете:

 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 .. 

Вы недопонимаете методы класса. Методы класса неявно передаются самостоятельно. Self не существует 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