Python学习:构造和析构(__init__(),__new__(),__del__())

一、 __init__(self[,...])

  1. __init__()相当于其他面向对象编程语言的构造方法,也就是类在实例化成对象的时候回首先调用的一个方法
  2. 对于什么时候在类定义时写__init__()需要看需求,根据具体情况
  3. 实例
"""定义一个矩形,需要长和宽两个参数,拥有计算周长和面积的两个方法。
需要在对象初始化的时候用户长和宽两个参数因此需要重写__init__()方法
__init__()是类在实例化成对象时,首先调用的一个方法。
"""
class Rectangle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    	# __init__()方法的返回值一定是None,不能是其他,有待验证

        # print(self.x,self.y)

    def getPeri(self):
        return (self.x + self.y) * 2

    def getArea(self):
        return self.x * self.y


rect = Rectangle(3,4)
a = rect.getArea()
b = rect.getPeri()
print("长方形的周长为:%d" % b)
print('长方形的面积是:%d' % a)

二、 __new__(cls[,...])

  1. 如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__new__()方法接受的初始化参数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而 __new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出 货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品。
  2. __new__()才是一个对象实例化所调用的第一个方法,它跟其他的魔法方法不同,它的第一个参数不是 self 而是这个类(cls),而其他的参数会直接传递给__init__()方法的
  3. __new__()方法需要返回一个实例对象,通常是cls这个类实例化的对象。
  4. 平时很少重写他,但是当继承一个不可变的类型时,它就显得尤为重要
  5. 示例
#这里类CapStr继承一个不可变的类Str,需要将字符串变成大写字符串
class CapStr(str):
	#由于str这个类不可修改,因此实例化之前第一步就要修改它
    def __new__(cls, string):
        # upper()内置函数将字母转换为大写
        string = string.upper()
        return str.__new__(cls, string)
a = CapStr('this is a test')

这里返回str.__new__(cls,string),值得推崇,因为只需要重写我们关注的那部分内容,其他琐碎东西交给Python的默认机制去完成就可,降低出错的几率

三、 __del__()

  1. 如果__init__()__new__()方法是对象的构造器,那么__del__()方法则可称为析构器,当对象要被销毁时,这个方法就会被调用
  2. 但是并不是del x 就相当于自动调用x.__del__ (),__del__ ()方法是当垃圾回收机制回收这个对象时调用的
  3. 示例
class C:
    def __init__(self):
        print('我是__init__方法,我被调用了')

    def __del__(self):
        print('我是__del__方法,我被调用了')
c1 = C()
c2 = c1
c3 = c2

在这里插入图片描述
图中可看出只有赋值的对象全部被删除是,方法__del__()才被调用
因为只有赋值的对象全部被删除,回收机制__del__()才会被调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南淮北安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值