__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 values | It is used for a direct call using the object |
It is invoked automatically when an object is declared | It is invoked automatically by a callable |
Called by an regular object | Called 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 |