【小甲鱼Python】魔法方法:构造和析构

笔记

__init__(self[,...]) 构造函数

__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。可根据初始化的需要对该方法进行改写:

class Rectangle:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def getPeri(self):
        return (self.x + self.y) * 2
    def getArea(self):
        return self.x * self.y

__init__方法的返回值是None,不能尝试对返回值进行改写:

class A:
    def __init__(self):
        return 'ABC'

此时尝试创建一个类A的实例化对象,会报错:

>>> a = A()
Traceback (most recent call last):
  File "", line 1, in 
    a = A()
TypeError: __init__() should return None, not 'str'

__new__[cls[,...]]

__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。cls是指代类的参数,后面的可选参数会在实例化时原封不动地传给__init__方法。

通常,该方法将返回一个cls类的实例化对象。当然,也可以对其进行改写以返回其他类的实例化对象。

需要说明的是,new方法平时是极少去重写的,一般用Python默认的方案即可,但是有一种情况我们需要重写new魔法方法,就是继承一个不可变类型的时候,又需要进行些改的时候,那么它的特性就显得尤为重要了。

class CapStr(str):
    def __new__(cls,string):
        string = string.upper()
        return str.__new__(cls,string)
>>> a = CapStr('I love FichC.com!')
>>> a
'I LOVE FICHC.COM!'

总结:

  • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
  • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
  • __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
  • 我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节

参考来源:https://blog.csdn.net/qq_41020281/article/details/79638370

 

__del__(self) 析构函数

del x 并不是自动调用 x.__del__()。当没有任何变量引用某个对象时,由于Python的垃圾回收机制,会自动调用这个对象的__del__方法将其清除。

class C:
    def __init__(self):
        print('调用init')
    def __del__(self):
        print('调用del')

c1 = C()
c2 = c1
c3 = c2

再依次执行如下代码:

>>>del c3
>>>del c2
>>>del c1
调用del

可见,调用del x并不是让系统自动调用x.__del__(),只有当无变量引用该对象时,才会自动调用该对象的__del__方法。

 

 

你可能感兴趣的:(小甲鱼Python课后作业)