参考博客原址:
https://blog.csdn.net/u013550998/article/details/81387949
https://blog.csdn.net/yaokai_assultmaster/article/details/70256621
在Python的class中有一些函数往往具有特殊的意义。init()和call()就是class很有用的两类特殊的函数。
init()
在Python中,init()函数的意义等同于类的构造器(同理,del()等同于类的析构函数)。因此,init()方法的作用是创建一个类的实例。
call()
Python中的函数是一级对象。这意味着Python中的函数的引用可以作为输入传递到其他的函数/方法中,并在其中被执行。
而Python中类的实例(对象)可以被当做函数对待。也就是说,我们可以将它们作为输入传递到其他的函数/方法中并调用他们,正如我们调用一个正常的函数那样。而类中call()函数的意义正在于此。为了将一个类实例当做函数调用,我们需要在类中实现call()方法。也就是我们要在类中实现如下方法:def call(self, *args)。这个方法接受一定数量的变量作为输入。
假设x是X类的一个实例。那么调用x.call(1,2)等同于调用x(1,2)。这个实例本身在这里相当于一个函数。
总结
那么,init()和call()的区别如下:
1. init()的作用是初始化某个类的一个实例。
2. call()的作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期(call()不影响一个实例的构造和析构)。但是call()可以用来改变实例的内部成员的值。
class X(object):
def __init__(self, a, b, range):
self.a = a
self.b = b
self.range = range
def __call__(self, a, b):
self.a = a
self.b = b
print('__call__ with ({}, {})'.format(self.a, self.b))
def __del__(self, a, b, range):
del self.a
del self.b
del self.range
创建对象后,python解释器默认调用init()方法。当删除一个对象时,python解释器也会默认调用一个方法,这个方法为del()方法。在python中,对于开发者来说很少会直接销毁对象(如果需要,应该使用del关键字销毁)。Python的内存管理机制能够很好的胜任这份工作。也就是说,不管是手动调用del还是由python自动回收都会触发del方法执行:
import time
class Animal(object):
# 初始化方法
# 创建完对象后会自动被调用
def __init__(self, name):
print('__init__方法被调用')
self.__name = name
# 析构方法
# 当对象被删除时,会自动被调用
def __del__(self):
print("__del__方法被调用")
print("%s对象马上被干掉了..."%self.__name)
# 创建对象
dog = Animal("哈皮狗")
# 手动删除对象
del dog
cat = Animal("波斯猫")
cat2 = cat
cat3 = cat
# 当全部对象都被删除后,系统自动调用删除机制
print("---马上 删除cat对象")
del cat
print("---马上 删除cat2对象")
del cat2
print("---马上 删除cat3对象")
del cat3
# 这里系统会自动调用 __del__
print("程序2秒钟后结束")
time.sleep(2)