魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。
格式:__名字__() --> 称之为魔术方法
1.__init__
1 """
2 1.__init__
3 初始化魔术方法
4 触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
5 参数:至少有一个self,接收对象
6 返回值:无
7 作用:初始化对象的成员
8 注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有
9 """
10 class Person:
11 def __init__(self):
12 self.name = 'Seele'
13
14 p = Person()
15 print(p.name) # Seele
2.__new__
1 """
2 __new__
3 实例化魔术方法
4 触发时机: 在实例化对时触发
5 参数:至少一个cls 接收当前类
6 返回值:必须返回一个对象实例
7 作用:实例化对象
8 注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
9 没事别碰这个魔术方法,先触发__new__才会触发__init__
10 """
11 class Person:
12 def __init__(self,name):
13 self.name = name
14 print("------__init__------")
15
16 def __new__(cls, *args, **kwargs):
17 print("------__new__------")
18 return super().__new__(cls)
19
20 p = Person('Seele')
21
22 """
23 步骤:
24 1.创建Person,分配空间
25 2.进入__new__函数,创建内存地址给对象p
26 3.将p的内存地址给__init__中的self
27 4.执行__init__函数
28 5.将结果返回给p
29 """
3.__str__
1 """
2 __str__:
3 触发时机:使用print(对象)或者str(对象)的时候触发
4 参数:一个self接收对象
5 返回值:必须是字符串类型
6 作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
7 注意: 一定要在__str__中添加return,return后面的内容就是打印对象看到的内容
8 """
9 class Person:
10 def __init__(self,name,age):
11 self.name = name
12 self.age = age
13
14 def __str__(self):
15 return "姓名:" + self.name + " 年龄:" + str(self.age)
16
17 p = Person('Seele',16)
18 print(p) # 姓名:Seele 年龄:16
4.__call__
1 """
2 __call__
3 调用对象的魔术方法
4 触发时机:将对象当作函数调用时触发 对象()
5 参数:至少一个self接收对象,其余根据调用时参数决定
6 返回值:根据情况而定
7 作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
8 """
9 class Person:
10 def __init__(self,name):
11 self.name = name
12
13 def __call__(self, *args, **kwargs):
14 print("调用__call__方法")
15
16 p = Person("Selle")
17 p() # 调用__call__方法
5.__del__
1 """
2 __del__
3 析构魔术方法
4 触发时机:当对象没有用(没有任何变量引用)的时候被触发
5 参数:一个self 接收对象
6 返回值:无
7 作用:使用完对象是回收资源
8 注意:del不一定会触发当前方法,只有当前对象没有任何变量接收时才会触发
9
10 1.对象赋值:
11 p = Person('Seele')
12 p1 = p
13 说明:p和p1共同指向同一个地址
14 2.删除地址的引用:
15 del p1 删除p1对地址的引用
16 3.查看对地址的引用次数:
17 import sys
18 sys.getrefcount(p)
19 4.当一块空间没有了任何引用,默认调用__del__
20 """
21
22 import sys
23
24 class Person:
25 def __init__(self,name):
26 self.name = name
27
28 def __del__(self): # 通常情况下,不对其进行编写,否则会覆盖系统默认的__del__方法
29 print("------__del__------")
30
31 p = Person('Seele')
32 p1 = p
33 p2 = p
34
35 print(sys.getrefcount(p))
36 # sys.getrefcount(p)返回p被引用的次数:4 --> p p1 p2 sys.getrefcount(p)
37
38 del p1
39 print(sys.getrefcount(p)) # 3
40
41 del p2
42 print(sys.getrefcount(p)) # 2
43
44 s = 1
45 print(s) # 此时p仍旧占用着空间,因此,先打印s的值
46
47 del p
48 # print(sys.getrefcount(p)) # 会报错:NameError: name 'p' is not defined 因为p被删除了
49 # del p 没有任何一个引用指向该空间,此时__del__会被调用,打印"------__del__------"
50
51 n = 5
52 print(n) # 后打印n = 5