203-魔术方法:__init__()、__str__()、__del__()
class Person(object):
# 定义对象方法
def eat(self):
print('eat')
def drink(self):
print('drink')
p1 = Person()
p1.name = 'a'
p1.age = 50
p2 = Person()
p2.name = 'b'
p2.age = 80
对于上述代码,每次实例化一个新的对象,都要一个一个把属性手动添加进对象很麻烦(对象数量大以后,100个对象要添加200个属性,工程量相当大)
所以需要在类的内部直接描述未来对象拥有的公共属性
后来python中引入了魔术方法来解决这个臭毛病
什么是魔术方法
举栗子:下面这句常用代码👇
if __name__ == '__main__':
__name__
这是个变量,没有定义,但是能打印出结果
__name__
属于系统中自带的变量,不需要自己定义的
所以,在python中,左右两边有两个下划线的变量就是魔术变量,指的是拥有特殊功能的变量
同时,这种__xxx__()
的函数叫做魔法方法,指的是具有特殊功能的函数
学习魔术方法必须掌握两个知识点:①这个方法在什么情况下会被触发②这个方法在实际工作中有何作用
__init__()
方法(初始化方法或构造方法)
在其他语言中叫构造函数,作用是进行初始化工作
当实例化的时候,就会执行一遍里面的代码
实际工作应用场景:
①在类的定义,用于描述对象未来所拥有的公共属性
②还可以用于进行系统的初始化工作=》比如文件操作中的打开文件,数据库操作中的连接数据库等等
魔术方法:
①在什么情况下,___init__()
会被触发(调用):
- 当实例化对象时,
__init__()
方法会自动被触发,实例化多少次,__init__()
方法就会被调用多少次
②在实际工作中,主要用于公共属性的初始化或者项目的初始化工作
举个栗子:让我们Person实例化对象自动拥有name、age以及address三个公共属性
# 1、定义一个类
class Person():
# 初始化实例对象属性
def __init__(self, name, age):
# 赋予name属性、age属性给实例化对象本身
# self.实例化对象属性 = 参数
self.name = name
self.age = age
# 2、实例化对象并传入初始化属性值
p1 = Person('张三', 80)
# 3、调用p1对象自身属性name与age
print(p1.name)
print(p1.age)
注意,定义属性的时候不写self.
那么__init__
方法执行完以后,这个局部变量就会被清除
__str__()
方法
当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了__str__
方法,那么就会打印从在这个方法中 return 的数据。(另外要特别注意__str__
方法返回字符串类型的数据)
没有使用__str__()
方法的类:
# 1、定义一个类
class Car():
# 首先定义一个__init__方法,用于初始化实例对象属性
def __init__(self, brand, model, color):
self.brand = brand
self.model = model
self.color = color
# 定义一个__str__内置魔术方法,用于输出小汽车的相关信息
def __str__(self):
return f'汽车品牌:{self.brand},汽车型号:{self.model},汽车颜色:{self.color}'
# 2、实例化对象c1
c1 = Car('宝宝巴士', '叮叮车', '蓝色')
print(c1)
① __str__
这个魔术方法是在类的外部,使用print(对象)时,自动被调用的
② 在类的内部定义__str__
方法时,必须使用return返回一个字符串类型的数据
__del__()
方法(删除方法或析构方法)
当代码执行结束,或者主动清除对象的时候都会自动调用__del__()
方法
(当删除对象时(调用del删除对象或者文件执行结束后),python解释器会自动调用__del__()
方法。)
class Person():
# 构造函数__init__
def __init__(self, name, age):
self.name = name
self.age = age
# 析构方法__del__
def __del__(self):
print(f'{self}对象已经被删除')
# 实例化对象
p1 = Person('张三', 10086)
# 删除对象p1
del p1
__del__()
方法在使用过程中,比较简单,但是其在实际开发中,有何作用呢?主要用于关闭文件操作、关闭数据库连接等等。
__del__()
方法删除对象时的顺序问题
版本不同,有些版本时正序删除,有些版本时倒序删除,底层代码不同(大概是3.7.xx开始变成倒序删除)
3.7.xx之前的版本解析器:正序删除:底层采用队列:先进先出
3.7.xx之后的版本解析器:倒序删除:底层采用栈:先进后出
但是,不管正序还是倒序都时一样在内存中删除对象
面向对象照样可以用debug代码调试
用step into能一步一步进入类的代码里调试
总结
提到魔术方法:① 这个方法在什么情况下被触发 ② 这个方法有什么实际的作用
__init__()
:初始化方法或者称之为“构造函数”,在对象初始化时执行,其主要作用就是在对象初始化时,对对象进行初始化操作(如赋予属性)
__str__()
:对象字符串方法,当我们在类的外部,使用print方法输出对象时被触发,其主要功能就是对对象进行打印输出操作,要求方法必须使用return返回字符串格式的数据。
__del__()
:删除方法或者称之为“析构方法”,在对象被删除时触发(调用del删除对象或文件执行结束后),其主要作用就是适用于关闭文件、关闭数据库连接等等。
最后注意
为了数据安全性,不建议在类外部直接掉i用自身属性,要调用,通过针对性的方法来实现