В чем разница между __init__ и __call__? - PullRequest
391 голосов
/ 12 марта 2012

Я хочу знать разницу между __init__ и __call__ методами.

Например:

class test:

  def __init__(self):
    self.a = 10

  def __call__(self): 
    b = 20

Ответы [ 13 ]

2 голосов
/ 18 декабря 2017

__call__ позволяет возвращать произвольные значения, тогда как __init__, будучи конструктором, неявно возвращает экземпляр класса.Как правильно указали другие ответы, __init__ вызывается только один раз, тогда как __call__ можно вызывать несколько раз, если инициализированный экземпляр назначен промежуточной переменной.

>>> class Test:
...     def __init__(self):
...         return 'Hello'
... 
>>> Test()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __init__() should return None, not 'str'
>>> class Test2:
...     def __call__(self):
...         return 'Hello'
... 
>>> Test2()()
'Hello'
>>> 
>>> Test2()()
'Hello'
>>> 
2 голосов
/ 05 декабря 2016

Мы можем использовать метод call , чтобы использовать другие методы класса в качестве статических методов.

class _Callable:
    def __init__(self, anycallable):
        self.__call__ = anycallable

class Model:

    def get_instance(conn, table_name):

        """ do something"""

    get_instance = _Callable(get_instance)

provs_fac = Model.get_instance(connection, "users")  
0 голосов
/ 05 июня 2018

Метод __ init __ запускается автоматически при создании объекта. Он используется для инициализации переменных экземпляра.

class my_class():
    def __init__(self,a,b):
        self.a = a
        self.b = b
        print("Object was created, instance variables were initialized")

obj = my_class(1,2)  
print(obj.a)        #prints 1
print(obj.b)        #prints 2

Метод __ call __ может использоваться для переопределения / повторной инициализации тех же объектов. Это также облегчает использование экземпляров / объектов класса в качестве функций путем передачи аргументов объектам.

class my_class():
    def __init__(self, a,b):
        self.a=a
        self.b=b

    def __call__(self,a,b):
        Sum = a+b   
        return Sum 

obj = my_class(1,2)   #  a=1, b=2
Sum = obj(4,5)        #  a=4, b=5 instance variables are re-initialized 
print(Sum)            #  4 + 5= 9
...