面向对象-魔术方法

魔术方法:一种特殊的方法而已。
特点:不需要人工调用,在特定的时刻自动执行。

1.__init__ 初始化魔术方法 

1.触发时机:实例化对象之后触发
2.作用:为对象添加对象的所属成员。
3.参数:一个self 接受当前对象 其他的参数根据实例化的传参决定
4.返回值:无
5.注意事项:

 1  1 #__init__初始化魔术方法
 2  2 
 3  3 class Human:
 4  4     #属性
 5  5     sex = 'man'
 6  6     age = 1
 7  7     name = '张三'
 8  8     eye =2
 9  9     skin = 'yellow'
10 10 
11 11     #方法
12 12     #魔术方法__init__
13 13     def __init__(self,kidname):
14 14         print('init方法被执行')
15 15         #为对象加成员
16 16         self.sex = ''
17 17         self.age = 1
18 18         self.name = kidname
19 19 
20 20     def eat(self):
21 21         print('吃饭的方法')
22 22 
23 23     def run(self):
24 24         print('跑步的方法')
25 25 
26 26     def sleep(self):
27 27         print('睡觉的方法')
28 28 
29 29 #实例化一个人的对象
30 30
31 31 one = Human('刘佳怡') #实例化对像【1.制作一个对象(new),2.初始化对像(init)】
32 32 #输出结果:init方法被执行 33 34 print(one.__dict__)#打印对象成员 35 #输出结果:{'sex': '男', 'age': 1, 'name': '刘佳怡'} 36 37 print(one) 38 #输出结果:<__main__.Human object at 0x00000149782C0048>

 

2.__new__ 构造方法
1.触发时机:实例化对象的时候触发!
2.作用:管理控制对象的生成过程。
3.参数:一个cls接受当前类,其他的参数根据实例化的参数决定
4.返回值:可有可无 没有返回值,实例化结果为None
5.注意事项:new魔术方法跟init的魔术方法的参数一致(除了第一个)

 1 #__init__初始化魔术方法
 2 
 3 class Human:
 4     #属性
 5     sex = 'man'
 6     age = 1
 7     name = '张三'
 8     eye =2
 9     skin = 'yellow'
10 
11     #方法
12     #魔术方法(重载object内部自带的 __new__)
13     def __new__(cls,sex):
14         print('new方法被触发')
15         #return 'new的返回值'
16         #自已控制对象的生成过程(女的生,男的不生)
17         if sex == '':
18             #生成对象并返回
19             return object.__new__(cls) #object上帝之手,重做了一个Human对象
20         else:
21             return None
22 
23 
24     def eat(self):
25         print('吃饭的方法')
26 
27     def run(self):
28         print('跑步的方法')
29 
30     def sleep(self):
31         print('睡觉的方法')
32 
33 #实例化一个人的对象
34 #__new__方法在实例化对象的时候被执行
35 one = Human('')#实例化对像【1.制作一个对象(new),2.初始化对像(init)】
36 #输出结果:new方法被触发
37 print(one) #上面实例化是输入女,所以能做出对象:<__main__.Human object at 0x000001B2C1BE0048>
38 #输出结果:<__main__.Human object at 0x000001B2C1BE0048>
39 
40 #实例化一个人的对象
41 #__new__方法在实例化对象的时候被执行
42 one2 = Human('')#实例化对像【1.制作一个对象(new),2.初始化对像(init)】
43 #输出结果:new方法被触发
44 print(one2) #上面实例化是输入男,所以不能做出对象:None
45 #输出结果:None

 __new__方法延伸实例

 1 #__new__将猴子类重载到人类
 2 #猴子类
 3 class Monkey:
 4     pass
 5 
 6 #人类
 7 class Human:
 8     #重载new方法
 9     def __new__(cls):
10         #返回,对象.重载入Monkey猴子类
11         return object.__new__(Monkey)
12     pass
13 
14 #实例化人类对象
15 ren = Human()
16 
17 #打印人类对象
18 print(ren) #返回猴子的对象
19 #输出结果:<__main__.Monkey object at 0x00000238556B8588>

 

3.__del__ 析构方法 (拆构方法)
1.触发时机:对象被系统回收的时候自动触发(del不一定触发)
2.作用:回收程序使用过程的信息和变量等
3.参数:一个self接收当前对象
4.返回值:
5.注意事项:

 1 #__del__析构魔术方法
 2 class Human:
 3     #属性
 4     sex = 'man'
 5     age = 1
 6     name = '张三'
 7     eye =2
 8     skin = 'yellow'
 9     #方法
10 
11     def eat(self):
12         print('吃饭的方法')
13     def run(self):
14         print('跑步的方法')
15     def sleep(self):
16         print('睡觉的方法')
17     # 魔术方法(析构方法一般写在类的最后)
18     def __del__(self):
19         print('del方法被触发')
20 #实例化一个人的对象
21 #__del__方法系统在回收对象的时候被执行
22 one = Human()#实例化对像
23 print('==最后的代码==')
24 '''
25 在输出结果中可以看出,one对像实例化是在【==最后的代码==】之前,但del方法被触发却
26 在【==最后的代码==】之后,说明系统在回收对象时触发__del__
27 输出结果:
28 ==最后的代码==
29 del方法被触发
30 '''

 

4.__call__
1.触发时机:将对象当作函数调用的时候自动触发
2.作用:常用于归结类/对象的操作步骤,方便后期掉用
3.参数:一个self接受当前对象,其余的参数根据需求添加
4.返回值:可以有,可以没有
5.注意事项:

 

 1 #__call__魔术方法
 2 class Human:
 3     #属性
 4     sex = 'man'
 5     age = 1
 6     name = '张三'
 7     eye =2
 8     skin = 'yellow'
 9     #方法
10     def __call__(self,var):
11         print('call方法被触发'+ var)
12     def eat(self):
13         print('吃饭的方法')
14     def cry(self):
15         print('55555~~~~')
16 
17 #实例化一个人的对象
18 #将对象当做函数调用的时候自动触发
19 one = Human()#实例化对像
20 one('--->传入的数据')#
21 #1.在类中没有加入__call__方法,如果对象以【调用函数one()】调用就会如下报错
22 #2.输出结果:TypeError:“Human”对象不可调用
23 
24 #3.在类中加入__call__方法,对象就可以【调用函数one(传入的数据)】
25 #4.输出结果:call方法被触发--->传入的数据
__call__实例,制作一个账号验证过程
 1 #__call__实例,制作一个账号验证过程
 2 class ZuCe:
 3     ZanHao = '张三'
 4     Mima = '123456'
 5     SouJi = '13488888888'
 6     #__call__魔术方法
 7     def __call__(self,yanzen):#这里call方法可以传入多个参数
 8         print(self.ZanHao + yanzen)
 9         print(self.Mima + yanzen)
10         print(self.SouJi + yanzen)
11 
12 ZC = ZuCe()
13 ZC('--->验证中...')
14 '''
15 输出结果:
16 张三--->验证中...
17 123456--->验证中...
18 13488888888--->验证中...
19 '''

 

5.__len__

1.触发时机:使用len函数检测对象的时候自动触发
2.作用:使得len可以检测对象中某个数据的信息
3.参数:一个self接受当前对象
4.返回值:必须有,必须是整型
5.注意事项:len检测什么有程序员自己决定

 1 #__len__魔术方法
 2 class Car:
 3     #属性
 4     color = '黑色'
 5     weight = '2T'
 6     grand = '奥利奥'
 7     circle =['左前轮','右前轮','左后轮','右后轮','备胎']
 8 
 9     #方法
10     def __len__(self):
11         print('len方法被触发')
12         num = len(self.circle)
13         return num
14     def playmusic(self):
15         print('车正在播放音响中...')
16     def move(self):
17         print('请注意,倒车...')
18 
19 #实例化一个人的对象
20 
21 mycar = Car()
22 #len函数接收对象,对象的方法得到__len__魔术方法,还得有return 返回值
23 result = len(mycar)#对象的返回值得有个变量来接收来可以
24 #没有加入__len__方法的输出结果:类型'Car'的对象没有len()
25 
26 #加入__len__方法的输出结果:TypeError: 'NoneType'对象不能解释为整数
27 #在__len__方法中加入 【return 整数】,输出结果:不会报错
28 
29 print(result)#
30 #输出结果:5

 

6.__str__
1.触发时机:使用print打印对象的时候自动触发
2.作用:可以定义打印对象显示的信息内容
3.参数:一个self接受当前对象
4.返回值:必须有,且必须是字符串类型
5.注意事项:除了print之外,使用str() 转换数据的时候也会触发

 

 1 #__str__魔术方法
 2 class Human:
 3     #属性
 4     color = '黄色'
 5     sex = ''
 6     age = 18
 7     name = '黄小丽'
 8 
 9     #方法
10     def __str__(self):#重载魔术方法__str__(继承object类的)
11         #__str__魔术方法必须返回值:'字符串'
12         print('str被触发')
13         return '加载了str方法'
14     def eat(self):
15         print('真香...')
16     def smile(self):
17         print('哈哈哈哈哈哈...')
18 
19 #实例化一个人的对象
20 
21 hxl = Human()
22 print(hxl)
23 
24 #没有重载__str__方法时打印对象,其实对象本身就有__str__方法,输出对象本身
25 #输出结果:<__main__.Human object at 0x00000241992C0F28>
26 '''
27 加重载__str__方法时打印对象
28 输出结果:
29 str被触发
30 加载了str方法
31 '''
32 
33 #str第二个被触发的时机,用str转换,只打印输出,没打印返回值
34 str(hxl)
35 #输出结果:str被触发

 

7.__repr__
1.触发时机:在使用repr转换对象的时候自动触发
2.作用:可以设置repr函数操作对象的结果
3.参数:一个self接受有当前对象本身
4.返回值:有必须是字符串
5.注意事项:正常情况下,类中的__str__和__repr__魔术方法是完全一样的(字符串中的str和repr魔术方法就不一样。)

 1 #__repr__魔术方法
 2 class Human:
 3     #属性
 4     color = '黄色'
 5     sex = ''
 6     age = 18
 7     name = '黄小丽'
 8 
 9     #方法
10     def __repr__(self):
11         print('repr方法被触发')
12         #所有类默认存在一个等式
13         #__str__ = __repr__ 将repr的方法赋值给str方法,完全一样
14         return 'repr返回值'
15 
16     def __str__(self):#正常情况下,类中的__str__和__repr__魔术方法是完全一样的
17         print('str方法被触发')
18         return 'str返回值'
19 
20     def eat(self):
21         print('真香...')
22     def smile(self):
23         print('哈哈哈哈哈哈...')
24 
25 #实例化一个人的对象
26 
27 hxl = Human()
28 
29 print(hxl)
30 '''
31 输出结果:
32 str方法被触发
33 str返回值
34 '''
35 print(repr(hxl))
36 '''
37 输出结果:
38 repr方法被触发
39 repr返回值
40 '''

 

8.__bool__
1.触发时机:使用bool() 转换对象的时候自动触发
2.作用:用于检测对象成员的信息
3.参数:一个self接受当前对象
4.返回值:必须有且必须是布尔值
5.注意事项:

 

 1 #__bool__魔术方法
 2 class Man:
 3     #属性
 4     color = '黄色'
 5     sex = ''
 6     age = 28
 7     name = '小刚'
 8     jf = '已婚'
 9 
10     #方法
11     #__bool__魔术方法
12     def __bool__(self):#self后面不接受任何参数
13         print('bool方法被触发')
14         if self.jf == '已婚':
15             return True
16         else:
17             return False
18 
19 
20     def smokin(self):
21         print('多数男人会抽烟')
22     def say(self):
23         print('男人就会甜言蜜语')
24 #实例化一个人的对象
25 mr = Man()
26 print(mr)
27 #输出结果:<__main__.Man object at 0x00000297701F0F60>
28 
29 #转换对象
30 #一般情况下对象转换的结果就是True
31 var = bool(mr) #一但用bool转换对象bool的方法就会被触发
32 #输出结果:bool方法被触发
33 
34 print(var)#任何对象的返回值都得赋给变量才能打印出结果
35 '''
36 在类的属性中 jf = '已婚' 或 jf = '未婚' 来判断对象返回是 True 或 False
37 输出结果:True
38 '''

 

9.__format__
1.触发时机:
2.作用:
3.参数:
4.返回值:
5.注意事项:

 

 1 #__format__魔术方法
 2 class Girl:
 3     #属性
 4     color = '黄色'
 5     sex = ''
 6     age = 18
 7     name = '小丽'
 8 
 9     #方法
10     #__format__魔术方法
11     def __format__(self,arg):#aa接受的是限定的符号的字符串
12         print('format方法被触发')
13         print(arg)
14 
15         #实现format自带的对齐和填充功能
16         #1.按受限定符号
17         flag = arg
18         #2.拆分限定符号
19         fillchar = flag[0]#填充字符
20         align = flag[1]#对齐方式
21         length = int(flag[2:])#
22         #print(fillchar,align,length)
23         #3.根据不同的符号进行不同的填充操作
24         #判断对齐方式
25         if align =='>': #右对齐
26             newname = self.name.rjust(length,fillchar)
27             return newname
28         elif align =='^': #居中对齐
29             newname = self.name.center(length,fillchar)
30             return newname
31         elif align == '<': #左对齐
32             newname = self.name.ljust(length,fillchar)
33             return newname
34         else:
35             return ''
36 
37     def smokin(self):
38         print('买买买~~~')
39     def say(self):
40         print('吃烧烤~~')
41 #实例化一个人的对象
42 xcm = Girl()
43 print(xcm)
44 #输出结果:<__main__.Girl object at 0x000002688ED0B128>
45 #使用format来操作我们的对象1
46 action = '我和我的朋友{:@<20}去逛街'
47 result = action.format(xcm)
48 print(result)
49 '''
50 输出结果:
51 format方法被触发
52 @<20
53 我和我的朋友小丽@@@@@@@@@@@@@@@@@@去逛街
54 '''
55 
56 #使用format来操作我们的对象2
57 action = '我和我的朋友{:@>20}去逛街,买了'
58 result = action.format(xcm)
59 print(result)
60 '''
61 输出结果:
62 format方法被触发
63 @>20
64 我和我的朋友@@@@@@@@@@@@@@@@@@小丽去逛街,买了
65 '''
66 
67 #使用format来操作我们的对象3
68 action = '我和我的朋友{:@^20}去逛街,买了'
69 result = action.format(xcm)
70 print(result)
71 '''
72 输出结果:
73 format方法被触发
74 @^20
75 我和我的朋友@@@@@@@@@小丽@@@@@@@@@去逛街,买了
76 '''

 

posted @ 2019-05-12 14:41  双伟科技  阅读(268)  评论(0编辑  收藏  举报