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__()会被触发(调用):

# 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用自身属性,要调用,通过针对性的方法来实现