码迷,mamicode.com
首页 > 编程语言 > 详细

Python构造器及析构器:__init__与__new__及__del__

时间:2016-01-12 23:06:01      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:

__init__与__new__这两个魔法方法组成了Python类对象的构造器,在Python类实例化时,其实最先调用的不是__init__而是__new__。__new__是负责实例化对象的,而__init__是初始化操作。__del__是析构器,当Python对象的所有引用都不存在了(被del了),就会自动触发__del__执行。

 

class CapStr(str):
    def __new__(cls, string):   #此时string = ‘i love you‘ cls是CapStr这个类对象
        string = string.upper()
        return str.__new__(cls, string) #返回cls类带string参数的实例化的对象,但是这里为什么不直接return string ?看下面的代码段
    def __del__(self):
        print(__del__析构方法被调用了!)

>>> a = CapStr(‘i love you‘)
>>> b = a
>>> c = b
>>> del c
>>> del a
>>> del b
__del__析构方法被调用了!

由于CapStr类继承的是str这种不可修改的类型,所以,就不能在__init__方法中对str类型的数据进行自身的改变,这时候就要重写__new__来实现对不可变类型数据的修改。

1.a = CapStr(‘i love you‘)
2.首先执行使用‘i love you‘这个参数来执行CapStr类的__new__方法,这个__new__方法会返回CapStr类的一个实例(通常情况下是使用 super(CapStr, cls).__new__(cls, ... ...) 这样的方式),
3.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是__init__里面的的self
所以,__init__ 和 __new__ 最主要的区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后,它是实例级别的方法。
2.__new__ 通常用于控制生成一个新实例的过程,它是类级别的方法。

 

class CapStr(str):
    def __new__(cls, string): 
        string = string.upper()
        return string

a = CapStr(‘mmy‘)

>>> type(a)
<class ‘str‘>

class CapStr(str):
    def __new__(cls, string): 
        string = string.upper()
        return str.__new__(cls, string)

>>> a = CapStr(‘mmy‘)
>>> type(a)
<class ‘__main__.CapStr‘>

可以看出,二者返回的对象是不一样的。

注:str.__new__(cls, string)的实际意思是str(string),使用工厂函数str()将参数强制转换成str类型,然后再变成str的子类型CapStr

Python构造器及析构器:__init__与__new__及__del__

标签:

原文地址:http://www.cnblogs.com/paomaliuju/p/5125686.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!