1,定义:
魔法方法:一种类/对象中的方法在特定时间自动触发。
2,__init__魔法方法的初始化
触发时机:触发初始对象
至少一个参数self用于接受对象
返回值:无
功能:初始对象成员
注:该方法是为对象初始化,类没有初始化成员
import random class Human: #属性 age = 0 color = 'yellow' #方法 def __init__(self,newname): #print(self) #print('init实施方法‘) #初始化性别 if random.choice(男,'女']) == '男': self.sex = '男' else: self.sex = '女' #初始化姓名(添加对象)name成员属于型) self.name = newname def eat(self): print(我爱吃麻小!') def drink(self): print(我爱快乐水) #实例对象 ld = Human#1.制作对象 2.初始化对象(初步处理!') def drink(self): print(我爱快乐水) #实例对象 ld = Human#1.制作对象 2.初始化对象(初步处理) print(dir(ld)) print(dir(Human))
3,__new__实例魔法方法
触发时机:实例化时触发
至少一个参数cls 接受当前类
返回值:必须返回一个对象的例子
功能:实例对象
注意:实例化对象是object类底层实现 ,继承了其他类别object的__new__实现实例化对象的方法
class Human(object): #属性 age = 0 color = 'yellow' #方法 def __new__(cls,familyName):#实际操作相当于重载object中的__new__方法 #print(cls)#cls表示当前类别 #print('new触发方法!') #判断是否姓王,姓王就生出对象,否则就不出生 if familyName == '王': #借助object生产对象在中间__new__实例对象!(如果用cls实例化对象将递归调用重载法__new__) return object.__new__(cls) else: return None def eat(self): print(我爱吃麻小!') def drink(self): print(我爱快乐水) #实例对象 xtd = Human#1.制作对象 2.初始化对象(初步处理!') def drink(self): print(我爱快乐水) #实例对象 xtd = Human#1.制作对象 2.初始化对象(初步处理) print(xtd)
4,__del__魔析魔法方法
触发时间:当对象没有引用任何变量时
参数:一个self接受对象
返回值:无
功能:使用对象时回收资源
注:只有当前对象没有任何变量接收时才会触发
class Human: #属性 color = 'yellow' age = 0 #方法 def __del__(self): print('__del__方法调用') h=Human() x=h #只有当前对象没有任何变量接收时才会被触发 del h print(程序结束)
5,__call__ 调用对象的魔法方法
触发时间:调用对象作为函数( 对象() )时触发
至少一个参数self接收对象 其余的根据调用时的参数决定
返回值:根据情况确定
功能:复杂步骤可合并,调用步骤可减少 用于装饰__call__方法实现
class Sleep: #外层函数 def __init__(self,arg): #print(arg) #如果有参数,则方便使用其他方法 self.arg = arg #可有可无 #装饰函数 def __call__(self,func): #print(func) #将基本函数存入对象 self.func = func #返回inner函数 return self.inner #未来的inner函数的方法 # 制作内部函数inner def inner(self): # 扩展功能1 print('----1----------') # 基本功能 self.func() # 扩展功能2 print('--------2---------') @Sleep('la')#@Sleep()-> @对象 @装饰器函数 ===> xxoo=sleep('la')(xxoo) def xxoo(): print('--------3-----------') #调用函数 xxoo()
6,__len__
触发时间:使用len(对象) 的时候触发
参数:一个参数self
返回值:必须是整形
功能:可设置为检测对象的成员数,但也可进行其他任意操作
注:返回值必须是整数,否则语法报错,格式要求。
class Human: #属性 age = 0 color = 'yellow' eye = 2 finger = 10 #方法 def eat(self): print('---1----') def tian(self): print('---2----') #魔术方法__len__ def __len__(self): print('len魔法方法被触发 #print(Human.__dict__)获取类的所有成员 字典 #过滤所有自定义成员 allmember = {k:v for k,v in Human.__dict__.items() if not( k.startswith('__') and k.endswith('__'))} #返回定制成员的数量 return len(allmember) #实例对象 juzi = Human() #len() 检测对象 result = len(juzi)#魔法开始len print(result)
7,__str__
触发时间:使用print(对象)或str(对象)触发
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)操作,获得字符串,通常用于快速操作
class JiaRui: #属性 sex = '女' age = 18 color = 'white' weight = 90 #方法 def smile(self): print('---------1--------') def cry(self): print('------2---------') #定义打印对象的结果 def __str__(self): print('str魔法方法被触发 #必须返回一个字符串 return '漂亮' #实例对象 jr = JiaRui() #直接打印对象 #print(jr) result = '我很' str(jr) '!' print(result)
8,__repr__
触发时间:正在使用repr(对象)触发
参数:一个self接收对象
返回值:必须是字符串
功能:转移对象repr也可用于快速操作,也可用于字符串
class Zhangsan: #成员属性 sex = '男' age = 28 length = '3.5cm' color = 'yellow' #成员方法 def lang(self): print(张3一头大波,浪') #定义repr魔术方法 def __repr__(self): #print('repr被触发') return '&&&&&&&&&&3.5cm小33&&&&&&&&' #类型默认有句话 #__str__ = __repr__ # 定义repr魔术方法 def __str__(self): # print('repr被触发') return '******3.5c小33********'
#实例化对象
z3 = Zhangsan()
#print()
print(z3)
#repr()
result = repr(z3)
print(result)
str的结果 字符串本身 (结果可以被eval执行)
如:x = '无图言Diao' str() ->无图言Diao
rerpr的结果 字符串定义结构 (eavl不会执行repr结果)
如:x = '无图言Diao' repr() ->'无图言Diao'
备注: 在类中通常情况下__str__和__repr__ 设置相同即可
eval()
函数 将字符串当作python代码执行
格式:eval(字符串)
返回值:可以有返回值
9,__bool__
触发时机: 使用bool(对象)的时候触发
参数:一个self接收对象
返回值:必须是布尔值
作用:根据实际情况决定,可以作为快捷方式使用
注意:仅适合于返回布尔值的操作
class zhangsan:
#属性
sex = '男'
age = 28
married = '离异'
#方法
def eat(self):
print('------------1---------')
def say(self):
print('----------2----------')
#bool转换对象:输出这个人是否已婚
def __bool__(self):
#print('bool被触发')
#判断此人是否已婚
if self.married == '已婚':
#必须返会布尔值
return True
else:
return False
#实例化对象
phx = zhangsan()
#
result = bool(phx)
print(result)
10,__format__
触发时机:使用字符串.format(对象)时候触发
参数:一个self接收对象,一个参数接收format的{}中的格式,例如:>5
返回值:必须是字符串
作用:设置对象可以作为format的参数,并且自定义对象格式化的规则
class zhangsan(object):
#属性
sex = '男'
age = 18
name = '帅哥'
#方法
def eat(self):
print('----------1-----------')
def say(self):
print('---------------2---------')
# __format__魔术方法
def __format__(self,sign):
#print('format被触发')
#print(sign)
'''
@>10 @填充符号 > 对其方式 10 字符总数
> 右对齐 < 左对齐 ^ 居中对其
'''
#获取标志内容
fillchar = sign[0]
align = sign[1]
total = int(sign[2:])#将字符串转换为整数
print(total,type(total))
#判断对其方式
if align == '^':#居中对其
result = self.name.center(total,fillchar)
elif align == '>':#右对齐
result = self.name.rjust(total,fillchar)
elif align == '<':#左对齐
result = self.name.ljust(total,fillchar)
else:
return 'mmp'
#返回一个字符串
return result
#实例化对象
syw = zhangsan()
#使用format函数
str1 = '同{:~^10}一起去唱K!'
result = str1.format(syw)
print(result)