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
作者:Ambitious
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!