python五中常见魔术方法
一、魔术方法:
(1)、引出:
在Python中,所有以双下划线__
包起来的方法,统称为Magic Method(魔术方法),它是一种的特殊方法,普通方法需要调用,而魔术方法不需 要调用就可以自动执行。魔术方法在类或对象的某些事件触发后会自动执行,让类具有神奇的“魔力”。如果希望根据自己的程序定制自己特殊功能 的类,那么就需要对这 些方法进行重写。Python中常用的运算符、for循环、以及类操作等都是运行在魔术方法之上的。
下面主要介绍五中常用魔术方法:__init__;__new__;__del__;__str__;__call__
1、__init__(self) :最常见的方法
①. 说明:初始化方法,相当于java中的构造方法,在__new__执行后被调用
②. 触发时机:初始化对象时触发(区别于__new__实例化时的触发)
③. 参数:一个self接受当前对象,其他的参数根据实例化的传参决定
④. 返回值:无
⑤. 作用:初始化对象的成员
⑥. 注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有
class Hunman: #属性 sex='max' age=1 name='张三' #魔术方法 __init__ 为对象添加成员 def __init__(self,kidname,petname): #print('方法被执行') #print(self) #打印自身和打印one相同 #为对象添加成员 self.sex='男' #固定参数 self.age=1 self.name=kidname #kidname为所传参数,给init接收 self.petname=petname #self.petname是对象的成员,petname是init的参数 #操作为执行过程方法所以无返回值 #方法 def eat(self): print("吃饭方法") one=Hunman('李明','张三') #实例化对象 1、制作一个对象 2、为对象初始化操作 one.eat() print(one.__dict__) #打印对象成员 print(one) #打印对象one
输出结果:
吃饭方法
{'sex': '男', 'age': 1, 'name': '李明', 'petname': '张三'}
<__main__.Hunman object at 0x0000012ABB3FBFD0>
2、__new__
①. 说明:说明:实例化对象方法
②. 触发时机:触发时机:在实例化时触发
③. 参数:一个cls接收当前类,其他的参数根据实例化的参数决定
④.返回值:可有可无 没有返回值,实例化结果为None
⑤. 作用:实例化(创建)对象,开辟内存地址空间对象并返回(管理控制对象的生成)
⑥. 注意:实例化对象是Object
类底层实现,其他类继承了Object
的__new__
才能够实现实例化对象
class Human: #魔术方法 (重载object内部自带的__new__) def __new__(cls,num): #用来控制对象的生成 #print('new魔术方法被触发') #print(cls) #自己控制对象的生成(1生成对象,2不生成对象) if num=='1': #生成对象并返回 #Human是1则生成对象 return object.__new__(cls) #object是所有类的父类 else: return None #实例化对象 one=Human('1') #实例化对象 1、制作一个对象(new触发) 2、为对象初始化操作(init触发) print(one)
输出结果:<__main__.Human object at 0x0000023A4787BF40>
3、__del__
①.说明:析构魔术方法
②.触发时机:当一块地址空间没有任何指针引用的时候被触发
在 Python 解释器中,当所有代码程序执行完成则会进行垃圾回收,也叫内存释放,这时就会触发__del__方法
使用del 对象名显示删除引用关系时,如果此操作将某块地址空间的最后一个引用关系给删除,则会触发__del__方法
③. 参数:仅只一个self参数接收对象
④.返回值:无
⑤. 作用:使用完对象时回收资源,没有指针引用的时候会调用,绝大多数时候不需要重写
⑥. 注意:del 对象名不一定会触发当前方法,只有某块地址空间无任何引用时才会触发
class Human: eye=2 skin='yellow' def eat(self): print('吃饭方法') #魔术方法,析构方法,对象被系统回收的时候自动触发(del不一定触发) def __del__(self): print('del方法被触发') #实例化一个对象 one=Human() #two=one #将对象同时赋值给另一个变量 print(one) del one #删除变量,系统回收对象 #del two print('***********')
输出结果:
<__main__.Human object at 0x0000023A1C9ABFD0>
del方法被触发
***********
4、__call__
①. 说明:调用对象函数的魔术方法
②. 触发时机:将对象当作函数调用时触发,使用形式为对象名称(),会默认调用__call__函数里的内容
③. 参数:至少得有一个self接收对象,剩余参数根据调用时传入的参数决定,写法为__call__(self, args)
④. 返回值:根据具体重写逻辑而定
⑤.作用:将复杂的步骤统一放在该函数内实现,减少调用的步骤,比较方便
⑥. 注意:无
''' class Human: #成员属性 name='张三' #魔术方法 def __call__(self): print('call方法被触发') #实例化对象 zs=Human() print(zs) zs() #正常情况下对象不能当做函数被调用 ''' #具体应用演示 class MakeCake: def huomian(self): print('和面操作') def fajiao(self): print('发酵操作') def __call__(self,kouwei): self.huomian() self.fajiao() print('我们要制作一个{}口味的蛋糕'.format(kouwei)) return '蛋糕' dg=MakeCake() #得到一个制作蛋糕的对象 #dg.huomian() #dg.fajiao() result=dg('巧克力') print(result)
输出结果:
和面操作
发酵操作
我们要制作一个巧克力口味的蛋糕
蛋糕
5、__str__
①. 说明:当print(对象名)时想看到更多的信息时,可以重写__str__方法,将想要输出的信息放在__str__函数中返回
②. 触发时机:使用print(对象名)或者str(对象名)的时候触发
③.参数:一个self参数接收对象
④. 返回值:必须是字符串类型
⑤.作用:print(对象名)时可以自定义输出更多有用信息
⑥. 注意:无
class Human: #成员属性 color='blue' name='李明' #成员方法 def ear(self): print('吃饭的方法') #魔术方法 def __str__(self): #重载魔术方法__str__(继承自object) #return '必须是字符串' print('str方法被触发') return self.name #定义打印对象显示的信息内容 #实例化对象 lm=Human() print(lm) #触发str的第二个时机 str(lm) #使用strz转换数据的时候也会被触发
输出结果:
str方法被触发
李明
str方法被触发