与任何其他OOP语言一样,Python也有构造函数和析构函数,但命名约定不同。在类中使用构造函数的目的是在创建类的实例时初始化类或实例级属性(主要是实例属性)或为其赋值。在Python中,__init__
方法被称为构造函数,在创建新实例时总是执行。Python支持三种类型的构造函数,如下所示:
默认构造函数
当我们在类中不包含任何构造函数(__init__
方法)或忘记声明它时,该类将使用空的默认构造函数。构造函数除了初始化类的实例外,什么也不做。
非参数化构造函数
这种类型的构造函数除了引用正在创建的实例外,不接受任何参数。以下代码示例显示了一个非参数化构造函数:
class 类:
def __init__(我):
print("这是'我'的一个实例,正在创建……")
类类 = 类() # 输出:这是'我'的一个实例,正在创建……
由于此构造函数不接收任何实参,因此我们可以向其添加的功能有限。例如,在我们的示例代码中,我们向控制台输出了一条消息,表示已为类
类创建了一个新实例。
参数化构造函数
参数化构造函数可以接受一个或多个参数,并且可以根据通过构造函数方法提供的输入参数设置实例的状态。类
类将使用参数化构造函数进行更新,如下所示:
class 类:
def __init__(我, 姓, 名):
我.姓 = 姓
我.名 = 名
析构函数
析构函数与构造函数相反——当实例被删除或销毁时,它们会被执行。在Python中,析构函数很少使用,因为Python有一个垃圾收集器,可以处理删除不再被任何其他实例或程序引用的实例。如果我们需要在析构函数方法中添加逻辑,我们可以使用特殊的__del__
方法来实现它。当删除实例的所有引用时,它会自动调用。以下是如何在Python中定义析构函数方法的语法:
class 类:
def __init__(我, 姓, 名):
我.姓 = 姓
我.名 = 名
def __del__(我):
print("我,姓名:", 我.姓, 我.名, "被删除了。")
if __name__ == "__main__":
类类 = 类("张", "三")
Python 的析构函数不会在变量超出作用域后自动执行。一个类如果需要释放一些资源,需要手工写一个其它方法,供释放资源使用。上面例子中的__del__
就不会实被自动执行。
class 类:
def __init__(我, 姓, 名):
我.姓 = 姓
我.名 = 名
def 清理(我):
print("我,姓名:", 我.姓, 我.名, "被删除了。")
def __del__(我):
print("再见。")
if __name__ == "__main__":
类类 = 类("张", "三")
类类.清理()
官方文档中表明启用周期检测器时会检测到垃圾的循环引用(默认情况下它是打开的),但只有在没有涉及Python __del__
方法的情况下才能清除。Python 不知道破坏彼此保持循环引用的对象的安全顺序,因此它则不会为这些方法调用析构函数。
<完>