【概述】:
本文讨论论python面向对象编程中的一个重要的话题—— 对象的实例化原理。主要讨论了三个魔术方法:
- __new__方法; - __init__方法; - __del__方法。
在python中,这三个方法分别涉及类的创建、类的初始化和类的销毁。下面逐一讲解之。
Ⅰ、对象实例化的原理
1.__new__(cls, [...])
方法
功能:创建类的实例。
在python语言中,__new__
方法是第一个执行的方法与实际创建并返回实例的方法(而非__init__
),只不过python已经内置实现了该方法,实际开发中这就足够了而不需要我们自行定义。一般而言若一个类中定义该方法,需要在实现本类逻辑之前引用父类的实现。
一般,__new__
方法的其它参数将完整地复制到__init__
方法中。因此调用类构造函数时,参数首先传递给__new__
方法后传递给__init__
方法。
class Myclass(object): def __new__(cls, [...]): """创建类的实例 """ instance = super(Myclass, cls).__new__(cls, [...]) # 类的实例 return instance # 往往希望__new__方法返回类的实例以执行__init__方法 def __init__(self,[...]): """初始化类的实例 __init__方法仅在__new__方法返回类的实例的时候被触发 """ ...
其中位置参数cls
表示创建实例所需要的类,必须在第一个位置且按照惯例命名为cls。
[注意]:
- 只通过
__new__
方法返回当前类的实例时才会被执行,如果返回的不是当前类的实例将不会调用__init__
方法。 - 若某些情况下
__new__
方法返回了其它类的实例,__init__
方法也同样可以被其它类定义的__new__
方法触发。这将可能导致因执行两个不同类的__init__
方法而产生问题。
2. __init__(self, [...])
方法
功能:(在类实例创建以后)对类的实例进行初始化性质的定义操作。
在上文中我们已经介绍过,__new__
方法用于创建实例。而一旦__new__
方法创建并返回类的实例后__init__
方法将被触发执行。实际应用中,__init__
方法用于未创建后的对象提供初始化的数据。请看下例:
class Rectangle(object): """矩形类 """ def __init__(self, x,y,width,height): """初始化数据 Parameters ---------- x: int,矩形左下角的横坐标; y: int,矩形左下角的纵坐标; width: int,矩形的宽; height: int,矩形的高。 """ self.x = x self.y = y self.width= width self.height= height def get_shap(self): """获取矩形当前的位置 """ return (self.width, self.height) def get_coordinates (self): """返回矩形当前的笛卡尔坐标值 """ return (self.x, self.y)
其中位置参数self
指向当前类的实例,必须在第一个位置且按照惯例命名为self。
在上述的矩形类的__init__
方法中通过传递x,y,widyh,height初始化了四个类属性:
- Rectangle.x
- Rectangle.y
- Rectangle.width
- Rectangle.height
这意味这我们在定义类的实例的时候必须给出x,y,widyh,height四个参数如下:
oneRec = Rectangle(x=0, y=0, width=20, height=100)
Ⅱ、对象的销毁
3.__del__方法
功能:在对象被销毁时执行的相关代码
虽然果需要销毁某个对象,可以使用del关键字实现。但由于python的内存管理机制能够很好地胜任对象地管理工作,垃圾回收器完成对象销毁地工作在python中是普遍被接受的,因此不得不说,在python中很少直接销毁对象。但不论是通过垃圾回收器也好,还是直接使用del关键字也好,一旦对象被销毁在销毁前都会触发__del__
方法的执行。