Python对象的2个内置方法__del__和__str__

2022-09-01 17:32:49 浏览数 (1)

一、内置方法:

方法名

类型

作用

__del__

方法

对象被从内存中销毁前,会被自动调用

__str__

方法

返回对象的描述信息,print函数输出使用

1.1 __del__方法

在python中,当使用类名()创建对象时,为对象分配完空间后,自动调用__init__方法,当一个对象被从内存中销毁前,会自动调用__del__方法。(__del__英文状态下的del左右一边各两个下划线)

应用场景:

__init__ :  改造初始化方法,可以让创建对象更加灵活。

__del__ :如果希望在对象被销毁前再做一些事情,可以考虑一下__del__方法。

生命周期:

一个对象从调用类名()创建,生命周期开始。

一个对象的__del__方法一旦被调用,生命周期结束。

在对象的生命周期内,可以访问对象属性或者让对象调用方法。


1.1.1 __del__代码演练

首先先来一段没有__del__方法的代码

代码语言:python代码运行次数:1复制
class Cat:

    def __init__(self, new_name):
        self.name = new_name
        print("%s来了" % self.name)


black = Cat("小黑")
print(black.name)

执行结果:

再来一段有__del__方法的代码

代码语言:python代码运行次数:0复制
class Cat:

    def __init__(self, new_name):
        self.name = new_name
        print("%s来了" % self.name)

    def __del__(self):
        print("%s走了" % self.name)


black = Cat("小黑")
print(black.name)

执行结果:

执行结果有小黑走了,但是我们并没有调用__del__方法,因为这个方法是在对象被从内存中销毁之前由系统自动调用的。

再次改造以上代码,增加一个分隔线:

代码语言:python代码运行次数:0复制
class Cat:

    def __init__(self, new_name):
        self.name = new_name
        print("%s来了" % self.name)

    def __del__(self):
        print("%s走了" % self.name)


black = Cat("小黑")
print(black.name)

print("-" * 30)

问题:此时可以猜一猜,小黑走了是在分隔线上面输出还是下面输出?

答案:在分隔线下方输出。

原因:因为black这个变量在当前模块中是全局变量,所以当所有的代码完成执行之后,系统会把black这个变量进行回收,在回收之前就自动执行了__del__方法。

执行结果:

使用del方法删除black对象代码:

代码语言:python代码运行次数:0复制
class Cat:

    def __init__(self, new_name):
        self.name = new_name
        print("%s来了" % self.name)

    def __del__(self):
        print("%s走了" % self.name)


black = Cat("小黑")
print(black.name)

del black

print("-" * 30)

执行结果:小黑走了在下划线下方输出

原因:因为del关键字可以删除一个对象,当使用del关键字把black对象删除之后,系统会自动帮我们调用__del__方法,把这个方法执行完成之后才会执行后面的那句打印分隔线代码。

以上整体代码截图:


2.1 __str__方法

在python中,使用print输出对象变量,默认情况下,会输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制表示)

如果在开发中,希望使用print输出对象变量时,能够打印自定义的内容,就可以利用__str__这个内置方法了。(也就是不希望输出默认情况下的类和内存地址内容,而是我们自己希望输出的内容,这个时候用__str__内置方法)

注意:__str__这个方法必须返回一个字符串。


2.1.1代码演练:

1.在默认情况下使用print看到的代码效果:

输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址。


2.使用__str__内置方法

代码语言:python代码运行次数:0复制
class Cat:

    def __init__(self, new_name):
        self.name = new_name
        print("%s来了" % self.name)

    def __del__(self):
        print("%s走了" % self.name)

    def __str__(self):
        # 必须返回一个字符串
        return "我是小猫 %s" % self.name


# black 是一个全局变量
black = Cat("小黑")
print(black)

执行结果:

并没有以上默认的一些对象信息,而是我们自己想要输出的定义的一些内容

关于面向对象方面的Python免费教程可以戳链接去看看,有文章也有视频。

0 人点赞