什么是魔法方法?
==目标:==了解什么是魔法方法?
魔法方法指的是:可以给Python类增加魔力的特殊方法。有两个特点:
(1)总是被双下划线所包围;
(2)在特殊时刻会被自动调用,不需要开发者手动去调用。
魔法方法语法:
__魔法方法名__()


在Python中,常用的魔法方法有:
| 魔法方法名 | 描述信息 | 
|---|---|
| __init__(self [, ...]) | 构造器,当一个对象被初始化创建时,会被自动调用。 | 
| __str__(self) | 输出对象名时,若不想直接输出内存地址值,可重写str()方法。 | 
| __del__(self) | 当一个对象被删除或销毁时,会被自动调用。 | 
==总结:==
(1)魔法方法的前后,总是被()包围着;==A、双下划线==;B、单下划线;
(2)注意:魔法方法会在某些特殊时刻被自动调用。
无参__init__()方法
 
==目标:==掌握无参
__init__()方法的使用。
在Python中,当新创建一个对象时,则会自动触发__init__()魔法方法。
| 魔法方法名 | 描述信息 | 
|---|---|
| __init__(self [, ...]) | 构造器,当一个对象被初始化创建时,会被自动调用。 | 
根据是否给__init__()魔法方法传递参数值,可分为:
(1)无参__init__()方法
(2)有参__init__()方法
无参__init__()方法语法:
class 类名:def __init__(self):代码...
说明:当仅需在类内部使用与初始化属性时,可以使用该方法。
例如,一起来完成:
(1)给小轿车这个对象默认设置颜色和轮胎数为:黑色、3个轮胎;
(2)创建对象后,直接获取属性结果。
# 定义Student类
# class Student:
#     def __init__(self):
#         print("执行了init...")
# init
# 创建对象
# stu = Student()  # 创建对象时,会自动调用Init方法
# stu.__init__()
# 1.定义类: 默认设置属性
class MyCar:def __init__(self):# 默认设定self.color = "黑色"self.number = 3
def func(self):print("============================")print(f"颜色:{self.color}")print(f"轮胎数:{self.number}")print("============================")
# 2.在类的外部访问属性
my_car = MyCar()
# print(my_car.color)
# print(my_car.number)
# 3.类内部访问属性
my_car.func() 
==总结:==
(1)当创建对象时,会()执行
__init__()方法;A、自动调用;B、不调用;(2)注意:建议自定义的类中,有一个
__init__()魔法方法。
==休息一下,15:40继续上课。==
有参__init__()方法
 
==目标:==掌握有参
__init__()方法的使用。
当想要在创建对象时,就设定属性值时,可以使用有参__init__()方法。语法:
class 类名:def __init__(self, 参数1, 参数2,...):代码...
说明:
(1)不需要给self传递参数值;
(2)传递参数个数的计算公式为【传递参数个数 = 定义方法后的参数总个数 - 1】。
例如,一起来完成:
(1)直接在创建车对象时,初始化设定颜色、轮胎数值;
(2)在类外部直接获取对象属性值。
# 1.定义类、方法
class Car:def __init__(self,color,number):   # 属性名会与传递的参数名名称保持一致self.color = colorself.number = number
# 2.创建对象
car = Car("黑色",4)
# 3.获取值
print(f"颜色:{car.color}")
print(f"轮胎个数:{car.number}") 
==总结:==
(1)
__init__()方法可以用来设置属性的默认值;(2)注意:当要在创建对象时,直接设定属性值,则可以通过有参
__init__()方法传递参数值来处理。
__str__()方法
 
==目标:==掌握
__str__()方法的使用。
内存地址值,也称为引用。表现形式有两种:
(1)十进制数 5040624,id()函数
(2)十六进制数 0x45AC6
说明:当直接输出对象名时,默认输出的是对象的内存地址值。
当在类中定义了__str__方法,则获取的是该方法返回的数据结果。
| 魔法方法名 | 描述信息 | 
|---|---|
| __str__(self) | 输出对象名时,若不想直接输出内存地址值,可重写str()方法。 | 
__str__方法语法:
class 类名:def __str__(self):代码...return 字符串型的结果
说明:必须返回字符串型的结果。

例如,一起来完成:
(1)创建一个有两个参数的小轿车对象,直接输出对象名,观察结果;
(2)思考:在输出小轿车对象名时,如何把颜色、轮胎数显示出来?
# 1.定义类
class Car:def __init__(self,color,number):self.color = colorself.number = number
def __str__(self):# return "颜色:"+self.colorreturn "颜色:"+self.color+",轮胎数:"+str(self.number)
# 2.输出对象名  -内存地址值
car = Car("白色",4)
# print(car)  # <__main__.Car object at 0x000001FBBCA72DF0>
# 3.如何显示
print(car)
# 总结
# 1.当直接输出对象名时,输出内存地址值,则表示没有重写str方法
# 2.当输出对象名不显示内存地址值, 重写了str方法 
==总结:==
(1)注意:当没有重写
__str__()方法时,输出对象名,则直接输出对象的()。==A、内存地址值==;B、属性名;
__del__()方法
 
==目标:==了解
__del__()方法的使用。
当删除对象时,会自动调用__del__()方法。
| 魔法方法名 | 描述信息 | 
|---|---|
| __del__(self) | 当一个对象被删除或销毁时,会被自动调用。 | 
__del__()方法语法:
class 类名:def __del__(self):代码...

例如,一起来完成:
(1)定义一个有品牌属性的车类;
(2)创建对象后,输出属性值;
(3)再使用__del__()方法删除对象查看效果;
(4)思考:当不调用【del 对象名】,__del__()方法会自动调用执行吗?
# 1.定义类
class Car:def __init__(self,brand):self.brand = brand
def __del__(self):print("=========__del__===========")
# 2.创建对象
car = Car("BMW")
# 删除 -内存
# del car   # 注释
print(car.brand)
# 3.查看del
# 注意: 为了能更方便的查看del效果, 建议使用 del xx语法 
==总结:==
(1)当使用【del 对象名】时,自动调用了
__del__()方法;(2)注意:当程序执行结束时,Python垃圾回收器会自动销毁内存垃圾,此时会自动调用
__del__()方法。