魔术方法
一、__del__魔术方法(析构方法)
触发时机:当对象被内存回收的时候自动触发[1、页面执行完毕回收所有变量 2、当多个对象指向同一地址,所有对象被del的时候]
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无
class Car():
color = "白色"
def run(self):
print("时速百公里")
def __del__(self):
print("我是析构方法")
print("<=======start======>")
car1=Car()
print("<=======ends======>")
运行结果:
出现上图现象的原因是在没有手动执行del的情况下,程序执行结束后触发析构方法。
color = "白色"
def run(self):
print("时速百公里")
def __del__(self):
print("我是析构方法")
car1=Car()
car2=car1
print("<=======start======>")
del car1
print("<=======ends======>")
运行结果:
问:在上图中,为什么我们在start与end中间删除了car1,但程序还是在执行完后触发析构方法?
答:因为car2还在继续占用car1的内存地址,所以会在car2执行完毕后触发析构方法。
图解:
同时删除car1和car2,内存地址没有指向的值,释放,触发析构方法:
class Car():
color = "白色"
def run(self):
print("时速百公里")
def __del__(self):
print("我是析构方法")
car1=Car()
car2=car1
print("<=======start======>")
del car1
del car2
print("<=======ends======>")
运行结果:
二、__str__ 和__repr__魔术方法
1、__str__
触发时机:使用print(对象)或str(对象)时触发
class Computer():
def __init__(self,logo):
self.logo=logo
def __str__(self):
return self.introduce()
def introduce(self):
return "我的电脑品牌是{}".format(self.logo)
obj=Computer("联想")