Python3-面向对象-魔术方法

魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。
格式:__名字__() --> 称之为魔术方法
 
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
 
posted @ 2020-05-31 13:59  闹点小情绪q  阅读(187)  评论(0编辑  收藏  举报