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方法被触发

 

            

 

posted @ 2022-11-09 00:24  _阿帆  阅读(19)  评论(0)    收藏  举报