2014-02-09 3 views
1

Я пытаюсь использовать атрибут экземпляра в качестве параметра по умолчанию. К сожалению, питон, кажется, не признает «я» переменнуюПочему нельзя использовать атрибут экземпляра в качестве параметра по умолчанию?

class Example(object): 

    def __init__(self, name): 
     self.bar = "" 

    def foo(self, param=self.bar): 
     print self.bar 

Почему не Python позволяет использовать себя в подписи метода? Кроме того, любые советы на гладком пути для достижения аналогичного результата без использования себя?

+2

Поскольку экземпляр не существует к моменту создания метода, поэтому его атрибуты не существуют. – bereal

ответ

2

Две причины. Во-первых, поскольку self также является параметром и поэтому существует только внутри самого тела метода, а не в сигнатуре функции.

Но во-вторых, что еще более важно, значения по умолчанию вычисляются во время их определения, а не при их вызове. Таким образом, это относится к экземпляру, который еще не создан.

Ответ заключается в определении значения по умолчанию None и проверка этого значения внутри метода.

2

self является параметром функции. Поэтому, пока вы не введете функцию, вы не сможете сделать self.something, потому что до того, как функция введена, нет определения self.

Вы можете сделать следующее:

class Example(object): 
    def __init__(self, name): 
     self.bar = name 

    def foo(self, param=None): 
     if param is None: 
      param = self.bar 
     # do stuff with param, which now defaults to self.bar 
Смежные вопросы