资讯详情

Python的魔术方法

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)

标签: syw二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台