2013-04-21 2 views
5

Мне сложно определить, какой код я натолкнулся.Какова цель прямого вызова __init__?

Код имеет класс Foo, который имеет метод __init__, который принимает несколько аргументов. Из того, что я узнал о Python до сих пор, позвонив по номеру Foo('bar'), он передаст эту строку в качестве параметра __init__ (который, как я полагаю, должен быть эквивалентом конструктора).

Но проблема, с которой я сталкиваюсь, заключается в том, что код, на который я смотрю, напрямую вызывает Foo.__init__('bar'). Какова цель этого? Я почти чувствую, что у меня нет другой цели за __init__.

ответ

11

Метод __init__() вызывается для вас при создании экземпляра класса. Тем не менее, метод __init__() в родительском классе не дозвонились автоматически, поэтому нужно, чтобы назвать это напрямую, если вы хотите расширить его функциональность:

class A: 

    def __init__(self, x): 
      self.x = x 

class B(A): 

    def __init__(self, x, y): 
      A.__init__(self, x) 
      self.y = y 

Примечание, вышеуказанный вызов также можно записать с помощью super:

class B(A): 

    def __init__(self, x, y): 
      super().__init__(x) 
      self.y = y 

целью метода является __init__() для инициализации класса. Обычно он отвечает за заполнение переменных экземпляра. Из-за этого вы хотите, чтобы __init__() вызывались для всех классов в иерархии классов.

1

Python позволяет напрямую вызвать конструктор (__init__). Позвонив Foo.__init__(obj, 'bar'), вы делаете инициализации,/реинициализацию obj

Смотреть этот код:

class Foo: 
    def __init__(self, s): 
     self.s = s 

f = Foo('abc') 
print(f.s) # prints 'abc' 
Foo.__init__(f, 'def') 
print(f.s) # prints 'def' 
+2

О, дорогой. Пожалуйста, не вызывайте '__init__' для выполнения повторной инициализации в любой разумной системе ... – nneonneo

+0

Согласен. Извините, если мое объяснение плохое. Прямо сейчас я просто хотел показать, что делает '__init__'. Не там, где это должно быть вызвано. –

+0

Говорить «' __init__' на самом деле не является конструктором, это скорее инициализатор », это не полезно. Это то, что кто-то написал в книге, когда это повторялось во всем Интернете, несмотря на то, что это не имеет смысла и просто путает людей, которые уже знают, что такое конструктор, кто изучает Python. '__init__' точно соответствует конструкторам с других языков, а официальная документация на Python даже относится к ней как к одному! Если вы могли бы вызвать конструктор на существующем объекте на любом другом языке OO, это именно то, что он сделал бы. – Ben

0

Да - при наследовании класс вызывает __init__() родительского класса. AFAIK, это единственный действительный случай прямого вызова __init__().

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