首页 > 其他分享 >魔术方法

魔术方法

时间:2024-12-03 20:33:27浏览次数:3  
标签:__ format self repr 魔术 str print 方法

#类的内置方法,也叫双下方法、魔术方法
# __call__ 实例化对象加上(), 可以触发这个类的 __call__ 方法,类似实例化时自动执行的__init__()

class F1():
    def __call__(self, *args, **kwargs):
        print('call')

f1 = F1()
f1() # call

# __eq__ 判断对象是否相等
class F2():
    pass

f2 = F2()
f22 = F2()
print(f2, f22) # 两个不同的类对象
print(f2 == f22) # False 

class F3():
    def __eq__(self, other):
        if type(self) == type(other) and self.__dict__ == other.__dict__: 
            return True
        else:
            return False

f3 = F3()
f33 = F3()
print(f3, f33) # 还是两个不同的对象
print(f3 == f33) # True 重写__eq__ 方法后,判断类中接口相同则返回true

 

format_dit = {
    'format1': '{obj.name}-{obj.sex}-{obj.age}',
    'format2': '{obj.sex}-{obj.age}-{obj.name}',
    'format3': '{obj.age}-{obj.name}-{obj.sex}'
}

class F4():
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age
    def __eg__(self, other):
        if type(self) == type(other) and self.__dict__ == other.__dict__:
            return True
        else:
            return False
    def __hash__(self):# 可hash对象必须要实现该方法
        return hash(self.name + self.age)
    def __str__(self):# 执行print()时会自动调用__str__方法,且必须返回str类型数据
        return 'S'.join([self.name, self.sex])
    def __repr__(self): # 与__str__相同,返回必须是str类型数据
        return 'R'.join([self.name, self.sex])
        # return self.age
    def __format(self, format_spec):
        if not format_spec or format_spec not in format_dit:
            format_spec = 'format1'
        fmat = format_dit[format_spec]
        return fmat.format(obj=self)

f4 = F4('T1', 'man', 11)
f44 = F4('T1', 'man', 11)
print(f4, f44) # T1Sman T1Sman
print(f4 == f44) # True 重写__eq__对比两个对象元素值

#hash()
L1 = [f4, f44]
print(L1) # [T1Rman, T1Rman]
print(set(L1)) # 实现__hash__方法后可用set() 集合进行去重

# __str__() 和 __repr__()
# 1、上面两次输出不一致,直接print使用str(),在容器中输出使用repr()
# 2、注释repr()方法后,下面示例在容器中输出时没有repr()时会使用默认输出,不会使用str(),所以注释repr()只保留str()时,输出对象内存地址
student = []
zs = F4('张三', '男', 11)
ls = F4('李四', '女', 12)
student.append(zs)
student.append(ls)
print(student) # [<__main__.F3 object at 0x7fb93fa116a0>, <__main__.F3 object at 0x7fb93fa11640>]  
for i in student:
    print(i) # 张三S男    李四S女  直接输出使用str()
#3、可以使用repr() 或 %r 执行对象的__repr__方法
print(repr(zs)) # 张三R男
print('111 %r' % ls) # 111 李四R女
#4、可以使用str() 和 %s 执行对象的 __str__方法
print(str(zs)) # 张三S男
print('222 %s' % ls) # 222 李四S女
# 注释掉__str__ 方法后,str() 和 %s 会使用 __repr__

# __format__ 自定义格式化输出
print(format(ls, 'format1')) # 李四-女-12
print(format(ls, 'format2')) # 女-12-李四
print(format(ls, 'format3')) # 12-李四-女
print(format(ls, 'test')) # 李四-女-12  条件判断设置了默认值

 

标签:__,format,self,repr,魔术,str,print,方法
From: https://www.cnblogs.com/ggsdddup/p/18584992

相关文章

  • 易语言带数组json的编写方法
    案例json:{"op":"subscribe","args":[{"channel":"tickers","instId":"123"},{"channel":"tickers","instId":"456"},{"channel":&......
  • 如何高效核对两个表格数据一致性,这两个方法要收藏好
    在日常工作和学习中,我们经常需要处理各种数据表格,无论是Excel、GoogleSheets还是其他数据管理工具,确保数据的准确性至关重要。特别是在处理财务数据、库存清单、客户信息等敏感数据时,核对两个表格的数据是否一致,是避免错误和遗漏的关键步骤。本文将详细介绍几种高效的方法,帮助......
  • 苹果手机更迭数据怎么办?4个苹果数据数据传输详细方法,简单便捷
    当我们购置了一款新的苹果手机时,就会想要把旧手机的数据传输到新手机,那么,怎么把旧的苹果手机传输数据到新手机?如果你刚好需要在新旧苹果手机之间传输数据,那么,本篇攻略将会帮助你快速传输数据。方法一、通过“快速开始”转移信息“快速开始”是苹果在iOS11及以上版本中引入......
  • 基于非线性预测和沿轨迹线性化MPC的车辆路径跟踪控制方法(2022年)
    国自科/北大核心华南理工大学、澳门大学1.摘要针对车辆路径跟踪模型预测控制(MPC)的动力学非线性问题和实时性要求,引入基于非线性预测和沿轨迹线性化的模型预测控制算法(MPC-NPLT),依据上一控制周期得到的控制序列预估系统未来的运动轨迹,将非线性因素从在线优化计算中排除,使其转化......
  • win10模拟软考极点五笔输入法方法
    写文背景2024年下半年报考了软考高级,现在还没出成绩,暂时不管过没过,我在这次软考中的论文书写体验是很差的,论文差点因为频繁切换输入法输入中英文没写完……考试最后几秒前写完。为啥呢?我日常使用五笔输入法,在win10环境中一般会用到微软五笔。问题是软考的五笔输入法有两种:搜狗......
  • 我们公司落地大模型的路径、方法和坑
    最近一年,LLM(大型语言模型)已经成熟到可以投入实际应用中了。预计到2025年,AI领域的投资会飙升到2000亿美元。现在,不只是机器学习专家,任何人都能轻松地把AI技术融入自己的产品里。前排提示,文末有大模型AGI-CSDN独家资料包哦!我们整理了一些关键的机器学习经验和技巧,这......
  • 企业想上大模型?现阶段的挑战、场景选择和落地方法
    临近2024年末,GPT5迟迟未出,似乎预示着大模型ScalingLaw遭遇了瓶颈。前排提示,文末有大模型AGI-CSDN独家资料包哦!但是,我们也看到,大模型在即将过去的一年仍然快速演进,展现出更加强大的文本理解及生成能力,以及复杂任务的推理能力。最近我交流的很多企业,都在积极将人工智......
  • 关于在Android Studio上实现的菜单功能未显示的解决方法
    概述 最近在学习菜单功能的时候,发现已经全部按照书本上要求来实现了,却怎么也没显示出菜单来。在互联网上查找许久,终于发现是因为在我的AndroidStudio上创建的项目自带主题,将主题上里“.NoActionBar”删除即可正常显示菜单栏。具体操作如下在项目视图里选择“app=>res=>val......
  • 日志注入与日志伪造是高级攻击者用来规避安全监测、隐藏攻击痕迹的常见手段。面对这种
    伪造和间接生成Windows日志的安全案例是存在的,且通常与攻击者利用日志注入或日志伪造技术有关。攻击者可以通过各种方法篡改Windows日志,以掩盖其恶意活动,掩饰入侵行为,或误导安全团队的调查。以下是几种可能的伪造和间接生成Windows日志的安全案例:1. 日志注入与伪造攻击......
  • 让任务动起来!看板方法彻底改变你的工作方式
    在现代高效工作中,“规划意识”是每个人必备的软技能。无论是个人项目还是团队协作,合理规划不仅是完成任务的保障,更是培养全局视野的重要手段。但很多人困惑于如何培养规划意识,这里分享一个简单却深刻的方法——通过在线协作看板工具将目标“具体化”和“可视化”。目标的“具象化......