• Python的魔术方法


    1,定义:

    魔法方法:一个类/对象中的方法,在特定的时刻自动触发。

    2,__init__初始化魔术方法

    触发时机:初始化对象时触发

    参数:至少一个self用于接受对象

    返回值:无

    作用:初始化对象的成员

    注意:该方法是为对象初始化,类不拥有初始化的成员

    1. import random
    2. class Human:
    3. #属性
    4. age = 0
    5. color = 'yellow'
    6. #方法
    7. def __init__(self,newname):
    8. #print(self)
    9. #print('init方法执行了')
    10. #初始化性别
    11. if random.choice(['男','女']) == '男':
    12. self.sex = '男'
    13. else:
    14. self.sex = '女'
    15. #初始化姓名(给对象添加了一个name的成员属于型)
    16. self.name = newname
    17. def eat(self):
    18. print('我爱吃麻小!')
    19. def drink(self):
    20. print('我爱快乐水')
    21. #实例化对象
    22. ld = Human('小明')#1.制作对象 2.初始化对象(初步处理!)
    23. print(dir(ld))
    24. print(dir(Human))

    3,__new__实例化魔法方法

    触发时机:实例化时触发

    参数:至少一个cls 接受当前类 

    返回值:必须返回一个对象的实例

    作用:实例化对象

    注意:实例化对象是object类底层实现 ,其他类继承了object的__new__方法才能实现实例化对象

    1. class Human(object):
    2. #属性
    3. age = 0
    4. color = 'yellow'
    5. #方法
    6. def __new__(cls,familyName):#实际操作相当于重载object中的__new__方法
    7. #print(cls)#cls表示当前的类
    8. #print('new方法被触发!')
    9. #判断是否姓王,姓王就生出对象,否则就不出生
    10. if familyName == '王':
    11. #借助object中的制作对象的__new__来实例化对象!(如果用cls('王')实例化对象会递归调用重载方法__new__)
    12. return object.__new__(cls)
    13. else:
    14. return None
    15. def eat(self):
    16. print('我爱吃麻小!')
    17. def drink(self):
    18. print('我爱快乐水')
    19. #实例化对象
    20. xtd = Human('王')#1.制作对象 2.初始化对象(初步处理!)
    21. print(xtd)

    4,__del__析构魔术方法

    触发时机:当对象没有任何变量的引用的时候被触发

    参数:一个self接受对象

    返回值:无

    作用:使用完对象时回收资源

    注意:只有当前对象没有任何变量接收时才会被触发

    1. class Human:
    2. #属性
    3. color = 'yellow'
    4. age = 0
    5. #方法
    6. def __del__(self):
    7. print('__del__方法被调用')
    8. h=Human()
    9. x=h #只有当前对象没有任何变量接收时才会被触发
    10. del h
    11. print('程序结束')

    5,__call__ 调用对象的魔术方法

    触发时机:将对象当作函数调用( 对象() )时触发   

    参数:至少一个self接收对象 其余根据调用时参数决定

    返回值:根据情况而定

    作用:可以将复杂的步骤进行合并操作,减少调用步骤  类做装饰器用__call__方法实现

    1. class Sleep:
    2. #外层函数
    3. def __init__(self,arg):
    4. #print(arg)
    5. #如果有参数究存入对象方便其他方法使用
    6. self.arg = arg #可有可无
    7. #装饰器函数
    8. def __call__(self,func):
    9. #print(func)
    10. #将基本函数存入对象
    11. self.func = func
    12. #返回inner函数
    13. return self.inner
    14. #未来的inner函数的方法
    15. # 制作内部函数inner
    16. def inner(self):
    17. # 扩展功能1
    18. print('----1----------')
    19. # 基本功能
    20. self.func()
    21. # 扩展功能2
    22. print('--------2---------')
    23. @Sleep('la')#@Sleep()-> @对象 @装饰器函数 ===> xxoo=sleep('la')(xxoo)
    24. def xxoo():
    25. print('--------3-----------')
    26. #调用函数
    27. xxoo()

    6,__len__

    触发时机:使用len(对象) 的时候触发

    参数:一个参数self

    返回值:必须是一个整型

    作用:可以设置为检测对象成员个数,但是也可以进行其他任意操作

    注意:返回值必须必须是整数,否则语法报错,另外该要求是格式要求。

    1. class Human:
    2. #属性
    3. age = 0
    4. color = 'yellow'
    5. eye = 2
    6. finger = 10
    7. #方法
    8. def eat(self):
    9. print('---1----')
    10. def tian(self):
    11. print('---2----')
    12. #魔术方法__len__
    13. def __len__(self):
    14. print('len魔术方法被触发')
    15. #print(Human.__dict__)获取类的所有成员 字典
    16. #过滤出来所有自定义成员
    17. allmember = {k:v for k,v in Human.__dict__.items() if not( k.startswith('__') and k.endswith('__'))}
    18. #返回自定义成员的个数
    19. return len(allmember)
    20. #实例化对象
    21. juzi = Human()
    22. #len() 检测对象
    23. result = len(juzi)#出发魔术方法len
    24. print(result)

    7,__str__

    触发时机:使用print(对象)或者str(对象)的时候触发

    参数:一个self接收对象

    返回值:必须是字符串类型

    作用:print(对象时)进行操作,得到字符串,通常用于快捷操作

    1. class JiaRui:
    2. #属性
    3. sex = '女'
    4. age = 18
    5. color = 'white'
    6. weight = 90
    7. #方法
    8. def smile(self):
    9. print('---------1--------')
    10. def cry(self):
    11. print('------2---------')
    12. #定义打印对象的结果
    13. def __str__(self):
    14. print('str魔术方法被触发')
    15. #必须返回一个字符串
    16. return '漂亮'
    17. #实例化对象
    18. jr = JiaRui()
    19. #直接打印对象
    20. #print(jr)
    21. result = '我很'+str(jr)+'!'
    22. print(result)

    8,__repr__

    触发时机:在使用repr(对象)的时候触发

    参数:一个self接收对象

    返回值:必须是字符串

    作用:将对象转使用repr化为字符串时使用,也可以用于快捷操作

    1. class Zhangsan:
    2. #成员属性
    3. sex = '男'
    4. age = 28
    5. length = '3.5cm'
    6. color = 'yellow'
    7. #成员方法
    8. def lang(self):
    9. print('张3一头大波,浪')
    10. #定义repr魔术方法
    11. def __repr__(self):
    12. #print('repr被触发')
    13. return '&&&&&&&&&&3.5cm小33&&&&&&&&'
    14. #类种默认都有一句话
    15. #__str__ = __repr__
    16. # 定义repr魔术方法
    17. def __str__(self):
    18. # print('repr被触发')
    19. return '******3.5cm小33********'
    20. #实例化对象
    21. z3 = Zhangsan()
    22. #print()
    23. print(z3)
    24. #repr()
    25. result = repr(z3)
    26. print(result)

    repr函数和str函数处理字符串的区别:

    str的结果 字符串本身 (结果可以被eval执行)

    如:x = '无图言Diao' str() ->无图言Diao

    rerpr的结果 字符串定义结构 (eavl不会执行repr结果)

    如:x = '无图言Diao' repr() ->'无图言Diao'

    备注: 在类中通常情况下__str__和__repr__ 设置相同即可

    eval()

    函数 将字符串当作python代码执行

    格式:eval(字符串)

    返回值:可以有返回值

    9,__bool__

    触发时机: 使用bool(对象)的时候触发

    参数:一个self接收对象

    返回值:必须是布尔值

    作用:根据实际情况决定,可以作为快捷方式使用

    注意:仅适合于返回布尔值的操作

    1. class zhangsan:
    2. #属性
    3. sex = '男'
    4. age = 28
    5. married = '离异'
    6. #方法
    7. def eat(self):
    8. print('------------1---------')
    9. def say(self):
    10. print('----------2----------')
    11. #bool转换对象:输出这个人是否已婚
    12. def __bool__(self):
    13. #print('bool被触发')
    14. #判断此人是否已婚
    15. if self.married == '已婚':
    16. #必须返会布尔值
    17. return True
    18. else:
    19. return False
    20. #实例化对象
    21. phx = zhangsan()
    22. #
    23. result = bool(phx)
    24. print(result)

    10,__format__

    触发时机:使用字符串.format(对象)时候触发

    参数:一个self接收对象,一个参数接收format的{}中的格式,例如:>5

    返回值:必须是字符串

    作用:设置对象可以作为format的参数,并且自定义对象格式化的规则

    1. class zhangsan(object):
    2. #属性
    3. sex = '男'
    4. age = 18
    5. name = '帅哥'
    6. #方法
    7. def eat(self):
    8. print('----------1-----------')
    9. def say(self):
    10. print('---------------2---------')
    11. # __format__魔术方法
    12. def __format__(self,sign):
    13. #print('format被触发')
    14. #print(sign)
    15. '''
    16. @>10 @填充符号 > 对其方式 10 字符总数
    17. > 右对齐 < 左对齐 ^ 居中对其
    18. '''
    19. #获取标志内容
    20. fillchar = sign[0]
    21. align = sign[1]
    22. total = int(sign[2:])#将字符串转换为整数
    23. print(total,type(total))
    24. #判断对其方式
    25. if align == '^':#居中对其
    26. result = self.name.center(total,fillchar)
    27. elif align == '>':#右对齐
    28. result = self.name.rjust(total,fillchar)
    29. elif align == '<':#左对齐
    30. result = self.name.ljust(total,fillchar)
    31. else:
    32. return 'mmp'
    33. #返回一个字符串
    34. return result
    35. #实例化对象
    36. syw = zhangsan()
    37. #使用format函数
    38. str1 = '同{:~^10}一起去唱K!'
    39. result = str1.format(syw)
    40. print(result)

  • 相关阅读:
    MindStudio模型训练场景精度比对全流程和结果分析
    响应式移动Web测试题
    【Leetcode】146.LRU缓存
    酒店管理系统的设计与实现/酒店客房管理系统/酒店预定系统
    ARFoundation系列讲解 - 89 适配华为机型
    yolov5分割+检测c++ qt 中部署,以opencv方式(详细代码(全)+复制可用)
    Meta Llama 3 里面装饰器
    面试题 2023/11/15
    scikit-learn算法精讲 之 层次聚类和树状图
    SpringBoot整合RabbitMQ,实现单机抢票系统
  • 原文地址:https://blog.csdn.net/zhan9le/article/details/125429622