📜  __init__ 和 __call__ 有什么区别?

📅  最后修改于: 2022-05-13 01:55:21.468000             🧑  作者: Mango

__init__ 和 __call__ 有什么区别?

Python中的 Dunder 或魔术方法是在方法名称中具有两个前缀和后缀下划线的方法。 Dunder在这里的意思是“双下(下划线)”。这些通常用于运算符重载。魔术方法的几个例子是: __init__, __add__, __len__, __repr__等。在本文中,我们将看到这两种方法之间的区别。

注意:更多信息请参考Python中的 Dunder 或魔法方法

__在里面__()

这种Python方法类似于任何其他编程语言中的构造函数。构造函数是与类同名的定义,在定义该类的对象时会自动调用。构造函数初始化程序的所有必需实体以使其更可靠。
与此定义类似,__init__() 用作Python构造函数,当定义类的对象时会自动调用它。它使用提供的默认值初始化所需的成员。也可以使用在类对象声明期间提供的值调用它。

例子:

class A:
    def __init__(self, x):
        print("inside __init__()")
        self.y = x
  
    def __str__(self):
        print("inside __str__()")
        print("value of y:", str(self.y))
  
# declaration of instance of class A
a = A(3)
  
# calling __str__() for object a
a.__str__()
  
# declaration of another instance 
# of class A
b = A(10)
  
# calling __str__() for b
b.__str__()

输出:

inside __init__()
inside __str__()
('value of y:', '3')
inside __init__()
inside __str__()
('value of y:', '10')

__称呼__()

在开始应用__call__()之前,我们需要了解什么是可调用对象。
可调用对象是可以像函数一样调用的对象。
在Python中,__call__() 用于解析与可调用对象关联的代码。任何对象都可以转换为可调用对象,只需将其写入函数调用格式即可。此类对象调用 __call__() 方法并执行与其关联的代码。这不会使对象不像正常对象那样工作。对象可以作为法线使用。
要记住的一件事是对象本身用作函数,因此语法应该是正确的。

例子:

class A:
    def __init__(self, x):
        print("inside __init__()")
        self.y = x
  
    def __str__(self):
        print("inside __str__()")
        print("value of y:", str(self.y))
  
    def __call__(self):
        res = 0
        print("inside __call__()")
        print("adding 2 to the value of y")
        res = self.y + 2
        return res
          
  
      
# declaration of instance of class A
a = A(3)
  
# calling __str__() for a
a.__str__()
  
# calling __call__() for a 
r = a()
print(r)
  
# declaration of another instance
# of class A
b = A(10)
  
# calling __str__() for b
b.__str__()
  
# calling __call__() for b
r = b()
print(r)

输出:

inside __init__()
inside __str__()
('value of y:', '3')
inside __call__()
adding 2 to the value of y
5
inside __init__()
inside __str__()
('value of y:', '10')
inside __call__()
adding 2 to the value of y
12

__init__() 与 __call__() 之间的区别

__init__()__call__()
Same as a constructor, it initializes the valuesIt is used for a direct call using the object
It is invoked automatically when an object is declaredIt is invoked automatically by a callable
Called by an regular objectCalled by a callable object
Example:
a=A(3) #statement 1
a() #statement 2
__init__() is called by statement 1
Example:
a=A(3) #statement 1
a() #statement 2
__call__() is called by statement 2