初始化和调用之间有什么区别?

2024-03-28 13:32:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道__init____call__方法之间的区别。

例如:

class test:

  def __init__(self):
    self.a = 10

  def __call__(self): 
    b = 20

Tags: 方法testselfinitdefcallclass区别
3条回答

在元类中定义自定义的__call__()方法允许将类的实例作为函数调用,而不是总是修改实例本身。

In [1]: class A:
   ...:     def __init__(self):
   ...:         print "init"
   ...:         
   ...:     def __call__(self):
   ...:         print "call"
   ...:         
   ...:         

In [2]: a = A()
init

In [3]: a()
call

第一个用于初始化新创建的对象,并接收用于执行此操作的参数:

class Foo:
    def __init__(self, a, b, c):
        # ...

x = Foo(1, 2, 3) # __init__

第二个实现函数调用运算符。

class Foo:
    def __call__(self, a, b, c):
        # ...

x = Foo()
x(1, 2, 3) # __call__

在Python中,函数是一类对象,这意味着:函数引用可以在其他函数和/或方法的输入中传递,并从它们内部执行。

类的实例(aka Objects)可以视为函数:将它们传递给其他方法/函数并调用它们。为了实现这一点,必须专门化__call__类函数。

def __call__(self, [args ...]) 它接受可变数量的参数作为输入。假设x是类X的实例,x.__call__(1, 2)类似于调用x(1,2)实例本身作为函数

在Python中,__init__()被正确定义为类构造函数(而__del__()是类析构函数)。因此,在__init__()__call__()之间有一个净的区别:第一个构建类up的实例,第二个使这样的实例可以作为函数调用,而不会影响对象本身的生命周期(即__call__不会影响构造/销毁生命周期),但是它可以修改其内部状态(如如下所示)。

例如。

class Stuff(object):

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

    def __call__(self, x, y):
        self.x = x
        self.y = y
        print '__call__ with (%d,%d)' % (self.x, self.y)

    def __del__(self):
        del self.x
        del self.y
        del self.range

>>> s = Stuff(1, 2, 3)
>>> s.x
1
>>> s(7, 8)
__call__ with (7,8)
>>> s.x
7

相关问题 更多 >