Python高级编专题 - 类的创建与销毁

简介: Python高级编专题 - 类的创建与销毁



【概述】:

本文讨论论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__方法的执行。

目录
相关文章
|
2月前
|
索引 Python
python-类属性操作
【10月更文挑战第11天】 python类属性操作列举
27 1
|
2月前
|
Java C++ Python
Python基础---类
【10月更文挑战第10天】Python类的定义
27 2
|
2月前
|
设计模式 开发者 Python
Python类里引用其他类
Python类里引用其他类
30 4
|
2月前
|
设计模式 开发者 Python
Python 类中引用其他类的实现详解
Python 类中引用其他类的实现详解
59 1
|
2月前
|
JSON 缓存 API
在 Python 中使用公共类处理接口请求的响应结果
在 Python 中使用公共类处理接口请求的响应结果
37 1
|
2月前
|
机器人 关系型数据库 Python
【Python篇】Python 类和对象:详细讲解(下篇)
【Python篇】Pyt hon 类和对象:详细讲解(下篇)
36 2
|
2月前
|
算法 Python
【Python篇】Python 类和对象:详细讲解(中篇)
【Python篇】Python 类和对象:详细讲解(中篇)
41 2
|
2月前
|
存储 C++ Python
【Python篇】Python 类和对象:详细讲解(上篇)
【Python篇】Python 类和对象:详细讲解(上篇)
55 2
|
3月前
|
前端开发 Python
Python编程的面向对象有哪些(二)
Python编程的面向对象(二)—类的多态
29 7
|
3月前
|
IDE Java 开发工具
Python类与面向对象
Python类与面向对象