python高级知识之常用的魔术方法

2023-11-11


前言:魔法方法(Magic Method)是python内置方法,格式为:“__方法名__”,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数

1、init()魔术方法

对象初始化时执行__init__

class Test:

    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("名字:" + self.name)
        print("年龄:" + self.age)


if __name__ == '__main__':
    a = Test("小李", "18")
-------输出结果---------
名字:小李
年龄:18

上面示例会发现:__init__方法会在类实例化的时候自动调用,无需手动执行;

2、new()魔术方法

对象初始化时执行__new__,目的是为该对象分配内存空间。
对象初始化时一般先执行__new__,再执行__init__,看下面示例:

class Test:
    def __new__(cls, *args, **kwargs):
        print("我是__new__方法")
        obj = object.__new__(cls)
        print(obj)
        return obj

    def __init__(self):
        print(self)
        print("我是__init__方法")


if __name__ == '__main__':
    a = Test()
    
-------输出结果---------
我是__new__方法
<__main__.Test object at 0x123902f70>
<__main__.Test object at 0x123902f70>
我是__init__方法

上面示例会发现:
1)__new__魔术方法返回的就是self的内存地址;
2)如果不在__new__方法里面调object的__new__方法就不会创建对象,__init__不会被执行;
3)如果不在__new__方法里面return创建好的对象,__init__不会被执行;

3、str()魔术方法

打印一个对象的时候,默认调用

class Test:

    def __init__(self):
        pass

    def __str__(self):
        return "test_name"


if __name__ == '__main__':
    a = Test()
    print(a)
-------输出结果---------
test_name

上面示例会发现:
1)操作类实例的时候自动化调用__str__,即print对象时,对象输出的样子;
2)还有一个魔术方法__repr__,与__str__类似,当同时出现时,str__优先级高于__repr

4、del()魔术方法

对象被删除的时候调用该方法

class Test:

    def __init__(self):
        print("初始化对象")

    def __del__(self):
        print("对象被删除了")


if __name__ == '__main__':
    a = Test()
    print("end")
-------输出结果---------
初始化对象
对象被删除了

上面示例会发现:
1)对象在内存中被释放时,自动触发执行;
2)此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以__del__()的调用是由解释器在进行垃圾回收时自动触发执行的

5、call()魔术方法

对象当作函数执行时会被默认自动调用

class Test:

    def __call__(self, *args, **kwargs):
        print("调用了__call__")


if __name__ == '__main__':
    a = Test()
    a()
-------输出结果---------
调用了__call__

上面示例会发现:把类实例当成函数执行的时候会触发__call__方法,对于 call 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

6、len()魔术方法

调用len()函数的时候自动调用

class Test:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __len__(self):
    	# 实例有自己的__dict__属性,__dict__是一个字典,键是属性名,值为属性值
        return len(self.__dict__)

if __name__ == '__main__':
    t = Test("狗子", 22)
    print(len(t))
-------输出结果---------
2

上面示例会发现:调用len()函数的时候自动调用,用来计算对象的长度

7、eq()魔术方法

调用相等判断的时候自动调用

class Test:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        print(self.age)
        print(other.age)
        return self.age == other.age


if __name__ == '__main__':
    t1 = Test("狗子", 22)
    t2 = Test("小李", 23)
    print(t1 == t2)
-------输出结果---------
22
23
False

8、hash()魔术方法

调用hash()方法时自动调用\

class Test:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __hash__(self):
        return hash(self.name)


if __name__ == '__main__':
    t = Test("狗子", 22)
    print(hash(t))
-------输出结果---------
902838481588431200

注意:只有不可变数据类型才有哈希值

9、getitem()魔术方法

获取实例属性的时候自动调用

class Test:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __getitem__(self, item):
        return self.__dict__[item]


if __name__ == '__main__':
    t = Test("狗子", 22)
    print(t['name'])
-------输出结果---------
狗子

10、setitem()魔术方法

用于设置对象属性

class Test:
    def __init__(self, name):
        self.name = name

    def __setitem__(self, key, value):
        self.__dict__[key] = value


if __name__ == '__main__':
    t = Test("狗子")
    print(t.__dict__)
    t['age'] = 22
    print(t.__dict__)
-------输出结果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}

11、delitem()魔术方法

删除对象属性时调用

class Test:
    def __init__(self, name):
        self.name = name

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delitem__(self, key):
        self.__dict__.pop(key)


if __name__ == '__main__':
    t = Test("狗子")
    print(t.__dict__)
    t['age'] = 22
    print(t.__dict__)
    del t['name']
    print(t.__dict__)
-------输出结果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}
{'age': 22}

12、delattr()魔术方法

class Test:
    def __init__(self, name):
        self.name = name

    def __setitem__(self, key, value):
        self.__dict__[key] = value

    def __delattr__(self, item):
        self.__dict__.pop(item)


if __name__ == '__main__':
    t = Test("狗子")
    print(t.__dict__)
    t['age'] = 22
    print(t.__dict__)
    del t.name
    print(t.__dict__)
-------输出结果---------
{'name': '狗子'}
{'name': '狗子', 'age': 22}
{'age': 22}

注意:__delitem__和__delattr__都是删除对象的属性,但是其用法不一样,注意看上面2个示例。

13、add()/sub()魔术方法

运算符执行计算时调用

class Test:
    def __init__(self, age):
        self.age = age

    def __add__(self, other):
        return self.age + other.age

    def __sub__(self, other):
        return self.age - other.age


if __name__ == '__main__':
    t1 = Test(22)
    t2 = Test(23)
    print(t1 + t2)
    print(t1 - t2)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python高级知识之常用的魔术方法 的相关文章

  • 判断线程是否已经启动

    如何判断Python线程是否已经启动 有一个方法is alive 但这是真的before and while一个线程正在运行 你可以看看ident领域的Thread实例 这Python 2 7 线程文档 http docs python o
  • OpenCV 错误:使用 COLOR_BGR2GRAY 函数时断言失败

    我在使用 opencv 时遇到了一个奇怪的问题 我在 jupyter 笔记本中工作时没有任何问题 但在尝试运行此 Sublime 时却出现问题 错误是 OpenCV错误 cvtColor中断言失败 深度 CV 8U 深度 CV 16U 深度
  • 如何有条件地组合两个相同形状的 numpy 数组

    这听起来很简单 但我想我把它想得太复杂了 我想创建一个数组 其元素是从两个形状相同的源数组生成的 具体取决于源数组中哪个元素更大 为了显示 import numpy as np array1 np array 2 3 0 array2 np
  • 如何用spaCy获取依赖树?

    我一直在尝试寻找如何使用 spaCy 获取依赖树 但我找不到任何有关如何获取树的信息 只能在如何导航树 https spacy io usage examples subtrees 如果有人想轻松查看 spacy 生成的依赖关系树 一种解决
  • 为 PyCharm 中的所有配置设置相同的环境变量

    我有一个与 Celery 和很多不同的工作人员一起的项目 如何避免每次将 PyCharm 中的环境变量复制粘贴到每个运行 调试配置 有什么方法可以在项目设置中设置它们吗 找到解决方案here https stackoverflow com
  • multiprocessing.freeze_support()

    为什么多处理模块需要调用特定的function http docs python org dev library multiprocessing html multiprocessing freeze support在被 冻结 以生成 Wi
  • 使用 Python 抓取维基百科数据

    我正在尝试从以下内容中检索 3 列 NFL 球队 球员姓名 大学球队 维基百科页面 http en wikipedia org wiki 2008 NFL draft 我是 python 新手 一直在尝试使用 beautifulsoup 来
  • 在 GAE/Python 中放置一次性代码和每次代码的最佳位置在哪里?

    我是 Google App Engine 和 Python 的新手 我无法理解有关在 Google App Engine 上运行的 Python 应用程序的一些基本问题 如果我想要执行代码 对于每个传入的请求 我应该将其放在哪里 我们正在捕
  • 如何在 Keras 中使用部分输入进行训练,其余部分用于损失函数

    我是 Keras 新手 正在尝试实现神经网络机器学习模型 输入张量看起来像 X1 X2 和输出 Y 注意 X1 和 X2 是相关的 在模型中 只有 X1 将用于训练 但 X1 和 X2 都将传递给损失函数 该损失函数是 X1 X2 y pr
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red
  • 将参数传递给 __enter__

    刚刚学习 with 语句尤其是这篇文章 http effbot org zone python with statement htm 问题是 我可以传递一个参数给 enter 我有这样的代码 class clippy runner def
  • python 中的基本矩阵转置

    我尝试了 python 中矩阵转置的最基本方法 但是 我没有得到所需的结果 接下来是代码 A 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 print A def TS A B A for i in range len A
  • Python:如何从文件中的一行读取字符并将它们转换为浮点数和字符串,具体取决于它们是数字还是字母?

    我有一个如下所示的文件 1 1 C C 1 9873 2 347 3 88776 1 2 C Si 4 887 9 009 1 21 我想逐行读取文件的内容 当我使用的行上只有数字时 for line in readlines file d
  • dask allocate() 或 apply() 中的变量列名

    我有适用于pandas 但我在将其转换为使用时遇到问题dask 有一个部分解决方案here https stackoverflow com questions 32363114 how do i change rows and column
  • DRF:以编程方式从 TextChoices 字段获取默认选择

    我们的网站是 Vue 前端 DRF 后端 在一个serializer validate 方法 我需要以编程方式确定哪个选项TextChoices类已被指定为模型字段的默认值 TextChoices 类 缩写示例 class PaymentM
  • SpaCy 中的自定义句子边界检测

    我正在尝试在 spaCy 中编写一个自定义句子分段器 它将整个文档作为单个句子返回 我编写了一个自定义管道组件 它使用以下代码来执行此操作here https github com explosion spaCy issues 1850 但
  • Python列表对象属性“append”是只读的

    正如标题所说 在Python中 我试图做到这一点 以便当有人输入一个选择 在本例中为Choice13 时 它会从密码列表中删除旧密码并添加新密码 passwords mrjoebblock mrjoefblock mrjoegblock m
  • Python“self”关键字[重复]

    这个问题在这里已经有答案了 我是 Python 新手 通常使用 C 最近几天开始使用它 在类中 是否需要在对该类的数据成员和方法的任何调用前添加前缀 因此 如果我在该类中调用方法或从该类获取值 我需要使用self method or sel
  • 获取运行云功能的运行时服务帐户

    有没有办法以编程方式从云功能获取运行时服务帐户的电子邮件 我知道我可以 猜测 默认的 App Engine 帐户 因为它始终是 appspot gserviceaccount com 但这不是我想要的 我本来期待有一些环境变量 https
  • 如何将 Pandas Dataframe 中的字符串转换为字符列表或数组?

    我有一个名为的数据框data 其中一列包含字符串 我想从字符串中提取字符 因为我的目标是对它们进行一次性编码并使之可用于分类 包含字符串的列存储在预测因子如下 predictors pd DataFrame data columns Seq

随机推荐

  • 算法笔记:Frechet距离度量

    曲线之间相似性的度量 它考虑了沿曲线的点的位置和顺序 1 概念 1 1 直观理解 主人走路径A 狗走路径B 他们有不同的配速方案 主人和狗各自走完这两条路径过程中所需要的最短狗绳长度 在某一种配速下需要的狗绳长度 但其他配速下需要的狗绳长度
  • Dictionary字典的用法及用途原理

    Dictionary 实例化Dictionary private Dictionary
  • wx原生微信小程序入门常用总结

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 定义值和修改值 1 定义值 2 修改值 1 代码 2 代码说明 3 注意点 二 点击事件 三 微信小程序的数据缓存 以setStorage为例使用 0 s
  • java linux class_Linux 下运行 class 文件

    1 基本命令 java cp searchDir classFile cp searchDir 指定从该目录搜索 class 文件 classFile 类路径 不包含 class 后缀 2 没有包结构的class文件 2 1 文件所在目录结
  • mybatis-plus中的条件构造器wrapper

    接口方法的参数中 会出现各种 Wrapper 比如 queryWrapper updateWrapper 等 Wrapper 的作用就是用于定义各种各样的条件 where 所以不管是查询 更新 删除都会用到 Wrapper 如 QueryW
  • el-date-picker怎样获取选择的时间范围值并判断是否大于7天

    场景 SpringBoot Vue Echarts实现选择时间范围内数据加载显示柱状图 SpringBoot Vue Echarts实现选择时间范围内数据加载显示柱状图 BADAO LIUMANG QIZHI的博客 CSDN博客 在上面需要
  • Linux网络编程:基础知识入门学习笔记汇总

    学习Linux的网络编程原则上基于 Linux的系统编程 和 Linux基础的Shell编程 第十章 除此之外还包含了计算机网络的知识 Linux基础shell编程 gt Linux 系统编程 gt Linux 网络编程 来源 黑马程序员
  • Hostmonitor邮件告警

    Hostmonitor可以通过邮件告警 打开Hostmonitor应用 1 点击Options 2 选择Mailer settings 3 Address输入框中填写网易邮箱的SMTP服务器地址 Port 输入框输入网易邮箱服务器端口 Au
  • 报`Uncaught (in promise)`错误解决办法

    使用了promise 但是在使用的过程中报Uncaught in promise 错误 第一次遇到这种错误 所以在此记录下 方便以后解决问题 getImage function url return new Promise resolve
  • getnameinfo failed

    在虚拟机vmware中用netstat 查看网络状态出现一行 getnameinfo failed 可能的一个原因 虚拟机使用NAT方式链接网络 解决方法 使用桥接方式即可
  • 【从零开始学c++】——类与对象(二)

    类与对象 1 构造函数 1 1构造函数的定义 1 2构造函数的特性 2 析构函数 2 1概念 2 2 特性 3 拷贝构造函数 3 1 概念 3 2 拷贝构造函数的特性 4 赋值运算符的重载 4 1 概念 4 2 实现日期类的运算符 4 2
  • 【Java基础知识 14】java动态代理原理

    Java学习路线思维导图 Java学习路线总结 思维导图篇 Java学习路线配套文章 搬砖工逆袭Java架构师 哪吒社区入口 哪吒社区 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 扫描主页左侧二维码 加入群聊
  • cumsum() R函数:用于产生随机变量的累积和

    gt 1 4 1 1 2 3 4 gt cumsum 1 4 1 1 3 6 10 函数介绍 Returns a vector whose elements are the cumulative sums cumsum 函数 Cumulat
  • python中import re_彻底搞懂Python 中的 import 与 from import

    对不少 Python 初学者来说 Python 导入其他模块的方式让他们很难理解 什么时候用import xxx 什么时候用from xxx import yyy 什么时候用from xxx yyy import zzz 什么时候用from
  • 又搞定一块屏幕 micropython 驱动 sharp memory lcd

    先来学学C是怎么写的 核心代码 void lcd refresh void uint16 t i 0 ln 0 SCS 1 delay us 5 write byte 0x80 for ln 0 ln lt 128 ln write byt
  • AI人流量统计算法,让公众场所人群管控更简单

    为强化疫情防控 公众场所时常需要调整人数上限 高效快捷限制人群聚集 减少疫情传播风险 以往的方式是投入大量人力在出入口设置门岗 对出入人员进行现场管理 统计及控制进出人流数量 基于区域人流量统计技术模型 快瞳科技 人流量统计检测算法 为疫情
  • 788. 旋转数字

    788 旋转数字 我们称一个数 X 为好数 如果它的每位数字逐个地被旋转 180 度后 我们仍可以得到一个有效的 且和 X 不同的数 要求每位数字都要被旋转 如果一个数的每位数字被旋转以后仍然还是一个数字 则这个数是有效的 0 1 和 8
  • 田志刚:企业知识管理的知识传播

    知识管理本身的知识传播是知识管理在国内发展的一个重要课题 虽然我们都认为知识管理有价值 但更多的人不知道 所以如何让更多的人知道KM 理解并知道如何实践就成为知识管理的知识传播的重要内容 知识管理的知识传播可以分两个层面 一个层面是对于社会
  • VMware Workstation Pro 16 安装win7

    本文使用U盘工具创建 至于为什么安装win7 毕竟很多游戏在win10已经没法玩了 1 创建虚拟机 典型创建即可 2 添加硬盘 SCSI类型 使用物理磁盘 物理驱动2 使用整个磁盘 这里的驱动2就是U盘 创建完成 这时候应该是正在使用该设备
  • python高级知识之常用的魔术方法

    文章目录 1 init 魔术方法 2 new 魔术方法 3 str 魔术方法 4 del 魔术方法 5 call 魔术方法 6 len 魔术方法 7 eq 魔术方法 8 hash 魔术方法 9 getitem 魔术方法 10 setitem