Python: переменные, наследование и аргументы по умолчанию - PullRequest
4 голосов
/ 15 февраля 2012

Я думаю, что у меня есть некоторые недоразумения по поводу использования "класса" и "наследования" в 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

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

Ответы [ 6 ]

10 голосов
/ 15 февраля 2012

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

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
3 голосов
/ 15 февраля 2012

Это не имеет ничего общего с наследованием. Вы можете попытаться сделать то же самое в базовом классе A, и он потерпит неудачу таким же образом.

Для достижения того, что вы хотите, просто сделайте:

def c(self, num=None):
    if num is None:
        num = self.data
2 голосов
/ 15 февраля 2012

Значения параметров функции по умолчанию оцениваются при определении функции, а не при ее вызове. Во время определения нет имени self.

Лучший способ - использовать None по умолчанию, а затем использовать логику в функции для интерпретации того, что это значит:

class C(A):
    def c(self, num=None):
        if num is None:
            num = self.data
        #.. the rest of the function ..
0 голосов
/ 15 февраля 2012

Как уже упоминалось, вы не можете использовать такую ​​переменную 'self'. Если вам не нужно менять значение данных позже, вы можете сделать следующее:

class A:
    data = 100

class C(A):
    def me(self, num=A.data):
        print num
0 голосов
/ 15 февраля 2012
class C(A):
    def c(self,data=None):
        if data == None:
            print self.data
        else 
            print data 

Метод вашего класса получает аргументы, вы не можете передать self.something.

0 голосов
/ 15 февраля 2012

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

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

...