WELCOME

不积跬步,无以至千里;不积小流,无以成江海。

Python--常用魔术方法

魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。

 

1.__init__

初始化魔术方法
触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
参数:至少有一个self,接收对象
返回值:无
作用:初始化对象的成员
注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有
创建完空间之后调用的第一个方法

 

2.__new__

实例化魔术方法
触发时机: 在实例化对时触发
参数:至少一个cls 接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
没事别碰这个魔术方法,先触发__new__才会触发__init__ '

 

 1 # 魔术方法
 2 class Person():
 3     '''
 4     初始化魔术方法
 5     触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
 6     '''
 7 
 8     def __init__(self, name):
 9         print('===init====',self)
10         self.name = name
11 
12     def __new__(cls, *args, **kwargs):  # __new__ 向内存空间要地址
13         '''
14         实例化魔术方法
15         触发时机: 在实例化对时触发
16         '''
17         print('===new===')
18         position = object.__new__(cls)
19         print(position)
20         return position
21 
22 # 由object开辟一个内存空间,然后扔给self,然后self在内存空间里放了一个name,又把地址扔给p
23 p = Person('tom')
24 print(p)
25 
26 '''
27 <__main__.Person object at 0x00000232853ED388>
28 ===init==== <__main__.Person object at 0x00000232853ED388>
29 <__main__.Person object at 0x00000232853ED388>
30 '''

 

new__方法的作用是申请内存开辟空间
流程是:
1、Person()进行到__new__进行申请空间,position就是新空间,然后返回给__init__
2、__init__接收到__new__返回的新空间positon,进行初始化。
3、p =Person()接受到__init__执行完毕的地址,p =position。

 

3.__call__

调用对象的魔术方法 
触发时机:将对象当作函数调用时触发
对象()
参数:至少一个self接收对象,其余根据调用时参数决定
返回值:根据情况而定
作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
注意:无
 1 # 魔术方法
 2 class Person():
 3     '''
 4     初始化魔术方法
 5     触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
 6     '''
 7 
 8     def __init__(self, name):
 9         print('---------->init', self)
10         self.name = name
11 
12     def __new__(cls, *args, **kwargs):  # __new__ 向内存空间要地址
13         '''
14         实例化魔术方法
15         触发时机: 在实例化对时触发
16         '''
17         position = object.__new__(cls)  # 由object开辟一个内存空间,然后扔给self,然后self在内存空间里放了一个name,又把地址扔给p
18         print('------------>new', position)
19         return position
20 
21     def __call__(self, name):
22         print('--------->call')
23         print('执行对象得到参数是:',name)
24 
25 p = Person('tom')
26 print('---------->p', p)
27 print(p.name)
28 # 将对象当成函数去使用
29 p('jack') # 默认执行__call__
30 '''
31 ------------>new <__main__.Person object at 0x00000221A4200348>
32 ---------->init <__main__.Person object at 0x00000221A4200348>
33 ---------->p <__main__.Person object at 0x00000221A4200348>
34 tom
35 --------->call
36 执行对象得到参数是: jack
37 '''

 

4.__del__

析构魔术方法
触发时机:当对象没有用(没有任何变量引用)的时候被触发
返回值:无
作用:使用完对象是回收资源
注意:del不一定会触发当前方法,只有当前对象没有任何变量接收时才会触发
1.对象赋值:p = Person()
         p1 = p
         说明:p和p1共同指向同一块地址
 2.删除地址引用:
        del p1 删除p1对地址的引用
 3.查看对地址的引用次数:
        import sys
        sys.getrefcount() 自己也会引用一次括号这个对象
 4.当一块空间没有了任何引用,默认执行__del__
 1 import sys
 2 
 3 
 4 class Person:
 5     def __init__(self, name):
 6         self.name = name
 7 
 8     def __del__(self):
 9         print('----------->del')
10 
11 
12 p = Person('jack')
13 p1 = p
14 p2 = p
15 print(p1.name)
16 print(p2.name)
17 
18 p1.name = 'tom'
19 
20 print(p.name)
21 print(p1.name)
22 
23 print(sys.getrefcount(p))
24 
25 del p2  # 断掉了p2的引用
26 print('删除p2后打印', p.name)
27 
28 print(sys.getrefcount(p))
29 
30 del p1  # 断掉了p1的引用
31 print('删除p1后打印', p.name)
32 print(sys.getrefcount(p))  # 获取这个对象的引用个数(这个函数自身会引用一次)
33 
34 del p
35 
36 n = 3
37 print(n)
38 
39 '''
40 jack
41 jack
42 tom
43 tom
44 4
45 删除p2后打印 tom
46 3
47 删除p1后打印 tom
48 2
49 3
50 ----------->del
51 '''

 

5.__str__

触发时机:使用print(对象)或者str(对象)打印对象名的时候
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
注意:一定要在__str__方法中添加return,return后面的内容就是打印的内容
 1 class Person:
 2     def __init__(self, name, age):
 3         self.name = name
 4         self.age = age
 5 
 6     def __str__(self):
 7         return '姓名是:' + self.name + ',年龄:' + str(self.age)
 8 
 9 
10 p = Person('tom', 18)
11 print(p)
12 # 没有使用__str__:
13 # >> <__main__.Person object at 0x000002AD7110CE48>
14 
15 # 使用__str__:
16 # >> 姓名是:tom,年龄:18

 

posted @ 2022-03-30 13:04  Ambitious~  阅读(77)  评论(0)    收藏  举报