zoukankan      html  css  js  c++  java
  • python-魔术方法

      

    魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。

    1.__new__魔术方法

      触发时机:实例化对象的过程当中触发
      功能:根据事情情况决定是否产生对象!
      参数:一个cls接收当前类,其余根据需求决定(new魔术方法的参数和init的参数一样)
      返回值:可有可无
    例:

    class Human(object):
        #方法
        def __new__(cls,familyName):#实际操作相当于重载object种的__new__哦数方法
            #print(cls)#cls表示当前的类
            #print('new方法被触发!')
    
            #判断是否姓王,姓王就生出对象,否则就不出生
            if familyName == '':
                #借助object中的制作对象的__new__来实例化对象!
                return object.__new__(cls)
            else:
                return None#实例化对象
    xtd = Human('')#1.制作对象 2.初始化对象(初步处理!)
    print(xtd)    
    # 当传的参数为'王'时 , 返回:<__main__.Human object at 0x00000000027C3AC8> ,表示已经制作了一个Human对象,可以对实例化对象进行操作
    # 为其他参数时,返回:None 表示没有制作对象,此时不能对实例化对象进行任何操作

    2.__init__魔术方法 

      触发时机:实例化对象后初始化对象的时候自动触发
      功能:对对象进行成员属性的设定(成员归于对象所有)
      参数:有一个self接收当前对象,其余根据需求决定!
      返回值:不需要

    例:

    class Human:  #定义类的时候可以不加(object),程序默认就加上了
        #方法
        def __init__(self,newname):
            #print(self)
            print('init方法执行了')
            self.name = newname
    #实例化对象
    ld = Human('张益达')#1.制作对象 2.初始化对象(初步处理!)
    print(ld.name)

    结果为:

    init方法执行了
    张益达

    __new__和__init__魔术方法的区别:http://www.cnblogs.com/ifantastic/p/3175735.html

    3.__del__魔术方法

      触发时机:当对象从内存中被移除的时候自动触发(1.系统回收所有资源,页面结束 2.所有该对象的变量都被删除的时候!)!
      功能:回收系统资源
      参数:一个self接收当前对象
      返回值:无

    例:

    class Human:
    
        #魔术方法
        def __del__(self):
            print('del魔术方法被触发!')
    
    #实例化对象
    obj1 = Human()#不是这里触发的!
    #将多个变量指向对象
    obj2 = obj1 #jr和xl都是使用同一个对象
    
    #从内存种删掉对象
    del obj1#删除变量,内存会回收资源
    del obj2
    
    print('-------------------------')
    #这里触发的!(什么也没有) 系统回收资源的时候自动触发!

    结果为:

    del魔术方法被触发!
    -------------------------

    注意:如果把删除的那两条语句注释或者不写,__del__魔术方法还是会执行:结果为:

    -------------------------
    del魔术方法被触发!

    这是因为:如果没有对象从内存中删除,一个程序执行完成后,会自动回收资源,就会触发__del__魔术方法

    4.__call__魔术方法

      触发时机:将对象当作函数调用时自动触发时机
      功能:代替一个方法的名称,为操作提供快捷方式
      参数:一个self接收当前对象,其余根据需求决定
      返回值:可有可无

    例:

    class Num(object):
        
        def run(self):
            print('----run-----')
        # a = num() 在直接用实例化对象调用的时候触发  如:a()
        def __call__(self,*args,**kwargs):
            print('----call方法被触发-----')
            return self.run()
    
    obj = Num()
    print(obj())

    结果为:

    ----call方法被触发-----
    ----run-----
    None #这是因为run()方法中没有返回值 加个return就好了

    5.__str__魔术方法

      触发时机:使用print()打印对象的时候或者使用str()转换对象的时候自动触发
      功能:设置对象打印时候的值
      参数:一个self接收当前对象
      返回值:必须是字符串类型!

    例:

    class Num(object):
        def __str__(self):
            print('这是一个类')
            print('用来测试str魔术方法的')
            return '-----str被调用--------'
    obj = Num()
    print(obj)

    结果为:

    这是一个类
    用来测试str魔术方法的
    -----str被调用--------

    6.__repr__魔术方法

      触发时机:使用repr()操作对象时候自动触发
      功能:设置repr()操作对象的返回结果
      参数:一个self接收当前对象
      返回值:必须是字符串

    例:

    class Num(object):
        def __repr__(self):
            return '------repr被调用------'
    obj = Num()
    print(repr(obj))

    结果为:

    ------repr被调用------

    7.__len__魔术方法

      触发时机:使用len检测对象的时候自动触发.
      功能:计算某个事物的长度
      参数:一个self接收当前对象
      返回值:必须是一个整数

    例:

    class Num(object):
        name = 'laowang'
    
        #魔术方法__len__
        def __len__(self):
            print('len魔术方法被触发')
            return len(self.name)
    obj = Num()
    print(len(obj))

    结果为:

    len魔术方法被触发
    7

    8.__bool__魔术方法

      触发时机:使用bool转换对象的时候自动触发
      功能:检测成员的状态
      参数:一个self接收当前对象
      返回值:必须是布尔类型

    class Num(object):
    
        #魔术方法__bool__
        def __bool__(self):
            print('bool魔术方法被触发')
            return True
    obj = Num()
    print(bool(obj))

    结果为:

    bool魔术方法被触发
    True

    9.__format__魔术方法

      触发时机:使用format操作对象的时候自动除法
      功能:定义format操作对象的方式
      参数:一个self接收当前对象,一个形参接收format的限定符号
      返回值:必须是字符串!

    例:

    class Num(object):
        def __format__(self, format_spec):
            print('format魔术方法被触发')
            return '并返回了一个字符串'
    obj = Num()
    print(format(obj))

    结果为:

    format魔术方法被触发
    并返回了一个字符串

    其他的魔术方法就不常用了,这里就不一一介绍了,使用方法都大同小异,如有错误,欢迎交流

  • 相关阅读:
    盘的转——使用缓动函数完成动画
    espnet环境配置(window)
    2021.9.8 Hadoop集群
    2021.9.7 开学第一课
    RS-422与RS-485
    70 进程创建的优化设计 下
    RGB液晶接口
    matlab2018a安装激活教程
    sed初级教程
    centos无法添加默认网关
  • 原文地址:https://www.cnblogs.com/mswei/p/9296379.html
Copyright © 2011-2022 走看看