一、内置方法:
方法名 |
类型 |
作用 |
__del__ |
方法 |
对象被从内存中销毁前,会被自动调用 |
__str__ |
方法 |
返回对象的描述信息,print函数输出使用 |
1.1 __del__方法
在python中,当使用类名()创建对象时,为对象分配完空间后,自动调用__init__方法,当一个对象被从内存中销毁前,会自动调用__del__方法。(__del__英文状态下的del左右一边各两个下划线)
应用场景:
__init__ : 改造初始化方法,可以让创建对象更加灵活。
__del__ :如果希望在对象被销毁前再做一些事情,可以考虑一下__del__方法。
生命周期:
一个对象从调用类名()创建,生命周期开始。
一个对象的__del__方法一旦被调用,生命周期结束。
在对象的生命周期内,可以访问对象属性或者让对象调用方法。
1.1.1 __del__代码演练
首先先来一段没有__del__方法的代码
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s来了" % self.name)
black = Cat("小黑")
print(black.name)
执行结果:
再来一段有__del__方法的代码
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__方法,因为这个方法是在对象被从内存中销毁之前由系统自动调用的。
再次改造以上代码,增加一个分隔线:
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对象代码:
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__内置方法
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免费教程可以戳链接去看看,有文章也有视频。