魔术方法就是一个类/对象中的方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法是在特定时刻自动触发。
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魔术方法被触发
并返回了一个字符串
其他的魔术方法就不常用了,这里就不一一介绍了,使用方法都大同小异,如有错误,欢迎交流