小甲鱼零基础学习python_26 【python中魔法方法一:构造和析构】

魔法方法总是被双下划线包围 例如_ _ init _ _

今天介绍构造和析构:


1. _ _ init_ _(self[,…]) 相当于构造方法:

init方法必须返回一个None对象,不能使用return语句!

class RecTangle:
    def __init__(self,length,width):
        self.length=length
        self.width=width
    def getPerl(self):
        return(self.length+self.width)
    def getArea(self):
        return(self.length*self.width)

rec =RecTangle(5,4)
print(rec.getArea())
print(rec.getPerl())

但是对象实例化真正第一个调用的魔法方法是: _ _ new _ _ (class[,….])

2. _ _ new _ _ (class[,….]):如果class,也就是这个类,后面有参数,则后面的参数会原封不动的返回给init

new必须返回一个实例对象,new返回的是传入第二个参数时候返回的关于第一个参数的实例化对象

那么什么时候会需要重定义new呢?

当继承一个不可变类型,但是又需要修改的时候,需要重定义new:

class CapStr(str):  #str是一个不可修改的父类
    def __new__(cls,stringValue):
        string=str(stringValue).upper()  #new必须返回一个实例对象
        return str.__new__(cls,string)    #返回str构造后的实例对象 → 一个大写的字符串


a = CapStr('i love FishC')
print(a)   # a此时是一个大写的字符串(实例对象)

那么构造以后,怎么析构我们的类呢?

3. del__(self) 析构器:当一个对象被销毁的时候,垃圾回收机制的时候会自动调用

但是不代表 del x = x.del()方法!!!

class C:
    def __init__(self):
        print('init被调用了...')
    def __del__(self):
        print('del被调用了...')
c1=C()
c2=c1
c3=c2

del c1
print('=======\n')
del c3
print('============\n')
del c2
在我们del c1的时候是不是就直接调用了del析构方法呢?

其实不是的,而是当没有对象映射到内存,才会调用del方法。

这里写图片描述

当c2删除后,最后一个指向内存的对象删除了,才调用del方法

猜你喜欢

转载自blog.csdn.net/Aka_Happy/article/details/82221553