【Python3_进阶系列_002】Python3-类的特殊方法2

一、类的特殊方法

在基础系列中我们已经介绍了一些常用的类的特殊方法【Python3_基础系列_017】Python3_类的特殊方法。类还有一些特殊方法需要掌握,是了解类的反射的基础。

__init__
__new__
__del__
__call__

1.1-实例的生命周期

一个实例是由类来生成的,使用完毕后会被回收。这个过程大致如下:

  1. 新建实例(简单理解:只是新建一个实例,但是没有任何的数据)
  2. 初始化(简单理解:对新建的实例进行初始化赋值)
  3. 使用(简单理解:执行实例的方法或者调用实例)
  4. 回收(简单理解:系统自动回收没使用的实例)

实际上这个过程在python中是通过一些特殊方法来完成的,对应如下:

  1. 新建实例:__new__()
  2. 初始化:__init__()
  3. 使用:__call__或者方法
  4. 回收:__del__()

其中实例化,回收方法也可以称为构造函数和析构函数。

1.2-自定义实例的生命周期

下面通过一个实例来演示上面的过程:

class Dog():
    def __new__(cls, *args, **kwargs): ##step1:新建一个实例
        print('1:__new__:新建一个实例')
        return super().__new__(cls)

    def __init__(self): ##step2:初始化一个实例(构造函数)
        super().__init__()
        print('2:__init__:初始化一个实例')

    def speak(self): ##step3:定义具体的方法
        print('3:具体的实例方法')

    def __call__(self, *args, **kwargs):##step4:或者定义调用方法
        print('3:__call__:实例的调用方法')

    def __del__(self): ##回收实例执行的方法(析构函数)
        print('4:__del__:回收实例的方法')


if __name__=="__main__":
    dog1 = Dog()##声明一个实例经历了2步:1.__new__() 2.__init__()
    dog1.speak()##步骤3:调用实例的具体方法
    dog1()##步骤3,4:调用实例,代码执行完毕会自动回收,执行__del__()方法

输出:
1:__new__:新建一个实例
2:__init__:初始化一个实例
3:具体的实例方法
3:__call__:实例的调用方法
4:__del__:回收实例的方法

二、利用__new__()方法实现单例模式

单例模式是指只能生成一个实例,这样的好处是避免多个实例对一些信息的访问造成线程不安全的问题。由于__new__()方法实际是控制实例的生成,因此修改new方法的可以实现简单的单例模式。

思路:new函数时,判断是否存在实例,如果不存在,就创建一个实例并返回;如果存在实例,直接返回已存在的实例。这样可以保证只有一个实例存在。

class Animal():
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'instance'):
            cls.instance = super().__new__(cls)
        return cls.instance

dog1=Animal()
dog2=Animal()

print(dog1==dog2)
输出:True
posted @ 2018-07-22 11:31  爱寂寞撒的谎言  阅读(95)  评论(0)    收藏  举报