面向对象-魔术方法
魔术方法:一种特殊的方法而已。
特点:不需要人工调用,在特定的时刻自动执行。
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 '''