• python进阶1:魔术方法


    1、定义

    在类里面,使用__xx__()形式的方法。这一类方法可以在类被构建的时候隐式调用,从而实现多种功能。也可以通过重载这些魔术方法,来实现自定义的功能。

    2、常用的魔术方法

    2.1 __new__方法

    分配内存对象并返回,返回的实际上是self的内存地址,如果定义了__new__但是不返回,那么其下的__init__将不会执行;但如果不定义__new__,会自动分配内存地址。

    class Pig:
        def __new__(cls, *arg, **kwargs):
            print('distribute memory space')
            obj = object.__new__(cls)
            print(obj)
            # return obj
            
        def __init__(self):
            print('Born a pig!')
    p=Pig()
    

    在这里插入图片描述

    class Pig:
        def __new__(cls, *arg, **kwargs):
            print('distribute memory space')
            obj = object.__new__(cls)
            print(obj)
            return obj
            
        def __init__(self):
            print('Born a pig!')
    
    p=Pig()
    

    在这里插入图片描述

    2.2 __init__方法

    初始化魔术方法

    2.3 _del__方法

    从内存中清除对象,对象会默认执行方法。具体执行的时间节点

    程序执行完毕,释放内存
    执行del指令时
    
    class Pig1:
        def __init__(self,value):
            print("对象被初始化了:{}".format(value))
         
        def __del__(self):
            print("对象被删除了")    
     
    p=Pig1("test")
    print('program finished!')
    

    在这里插入图片描述

    2.4 __call__方法

    当对象以函数方式调用时,会自动调用__call__

    class Flight:
        def __init__(self,number):
            self.number=number
            print(f"{number}号航班")
        #办理登机手续
        def checkIn(self):
            print("办理登机手续")
        #安全检查
        def securityCheck(self):
            print("安全检查")
        #登记,起飞
        def boarding(self):
            print("起飞,登机")
        def __call__(self,*args,**kwargs):
            self.checkIn()
            self.securityCheck()
            self.boarding()
            print("__call__被调用了")
    #实例化一个对象f
    f=Flight("CA1426")
    #以函数的方式调用f
    f()
    #以函数的方式调用对象会自动调用__call__
    #以下输出的结果
    
    

    在这里插入图片描述
    如果注视掉f()

    # f()
    

    那么就不会调用__call__,只会调用__init__,输出为:
    在这里插入图片描述

    2.5 __str__方法

    在打印类对象时调用。使用str强制转换数据类型,在输出结果时调用。

    class Dog:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return f"这是一条叫{self.name}的狗"
    
    d=Dog("阿毛")
    print(d)
    #自动调用__self__
    

    在这里插入图片描述
    注意:

    1. 必须print(d),__str__才会被自动调用
    2. __str__里必须返回一个string对象,如果将其定义中的return换成print,那么程序会报错

    2.6__repr__方法

    与__str__一样,也是输出对象的字符串格式,最大的不同在于,__repr__在可变容器(list,dict)中会被默认调用,否则,如果一个类中同时定义了__str__方法和__repr__方法,那么只会调用__str__方法 ,而不会调用__repr__方法

    class Dog:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return f"这是一条叫{self.name}的狗"
    	def __repr__(self):
            print("调用repr魔术方法")
            return f"dog:{self.name}"
    d=Dog("阿毛")
    print(d)
    
    

    在这里插入图片描述

    class Dog:
        def __init__(self,name):
            self.name=name
        def __str__(self):
            return f"这是一条叫{self.name}的狗"
    	def __repr__(self):
            print("调用repr魔术方法")
            return f"dog:{self.name}"
    d=Dog("阿毛")
    print(d)
    x=[d]
    print(x)
    
    

    str和repr都调用了
    在这里插入图片描述

    2.6 getitem(self, key)获取dict中某个key的值

    初始化类对象后自动调用

    2.7 setitem(self, key, value)设置dict数据

    初始化类对象后自动调用

  • 相关阅读:
    Ubuntu 配置
    vue3中遇到的问题
    使用AOP做日志切面
    股票程序化交易如何把交易分析简单化?
    基于conda的OpenCV库安装
    “次世代”究竟是什么?次世代角色建模又该怎么学?
    行测-图形推理-2-黑白格类
    虚拟桌宠模拟器:VPet-Simulator,一个开源的桌宠软件, 可以内置到任何WPF应用程序
    java-net-php-python-springboot健身房管理系统计算机毕业设计程序
    栈和队列相关的一些问题
  • 原文地址:https://blog.csdn.net/tianshuiyimo/article/details/126953380