2013-04-11 2 views
2

Простите меня, если «перегрузкой» не правильный термин здесь ...Реферирование себя в то время как перегрузка методов класса

Я пытаюсь сделать что-то вроде этого:

class Length: 

    def __init__(self, length = 0): 
     self._length = length 

    def twice(self, length = self._length): 
     return length*2 

Как вы можете видеть, я Я пытаюсь ссылаться на self._length в аргументе twice(). Python это не нравится. Я получаю NameError: name 'self' is not defined.

Есть ли хороший способ присвоить значение по умолчанию, как это, и получить то, что я хочу?

ответ

11

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

Вы должны сделать:

def twice(self, length=None): 
    if length is None: 
     length = self._length 
    return length*2 
+0

Спасибо! Это имеет смысл. Я надеялся, что мне не придется добавлять даже * две строки кода, но я вижу, что это, наверное, лучший способ. – mrKelley

+0

Если вы беспокоитесь о сохранении линейных каналов, вы можете использовать: 'return length is not None и length или self._length'. Это оставит больше линейных каналов для всех нас! – tdelaney

+1

Или просто используйте классический Mac и сделайте свою часть, чтобы контролировать перенаселение CR, вместо того, чтобы способствовать перелову LF. – abarnert

Смежные вопросы