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

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__魔术方法的区别:

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魔术方法被触发
并返回了一个字符串

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