Python基础(十一)—魔法方法(构造析构、属性魔法、算数魔法、类型魔法等)

python类的构造方法与内置属性 构造方法 我们来看一个例子: class person: def __init__(self): print(self) a=person() def __init__(self)语句定义person类的构造方法,self是必要的参数且为第一个参数。 用户可以在__init__()构造方法内加入许多参数,在创建类的同时,设置类的属性值。 ... 阅读详情

魔法方法介绍

  • 魔法方法都是被双下划线包围,例如__init__
  • 魔法方法是面向对象的一切,充分体现了面向对象Python的强大。
  • 魔法方法的魔力,体现在他们总能在合适的时候自动调用。

构造和析构

__init()__和__new__是python的构造器,实例化对象时调用。__del__方法是析构器,在对象将要被销毁的时候就会被调用。

  • __init()_方法
    _init
    (self[, …]),构造方法不是必须写的,是看实际需求,如果需要在实例化对象时,要对对象进行初始化处理,则需要重写该方法。
    • 在重写__init__时,不要对该函数进行return返回,只能是None
  • _new__方法
    实例化对象时,第一个被调用的方法是:_new
    (cls[, …]),第一个参数是class,如果后面有参数,会原封不动传给__init__方法,__new__方法需要一个实例对象作为返回值。但是__new__方法基本不会重写。
    • 当继承一个不可变的类型,但是需要变为可修改的话,只能重写__new__方法,如下例子:
class CapStr(str):
    def __new__(cls, string):
        string = string.upper()
        return str.__new__(cls, string)

a = CapStr('lz')
print(a)  # LZ
  • _del__方法
    _del
    (self),当没有任何变量引用后,经垃圾回收机制后,则会调用该方法。
class C:
    def __init__(self):
        print('__init__(self)方法')
    def __del__(self):
        print('__del__(self)方法')

c1 = C()  # __init__(self)方法
c2 = C()  # __init__(self)方法
c11 = c1
c12 = c1
del c2  # __del__(self)方法
del c11  # 不打印
del c12  # 不打印
del c1  # __del__(self)方法

基本的魔法方法与有关属性的魔法方法

  • 基本的魔法方法
魔法方法作用
_new_(cls[, …])1. _new_ 是在一个对象实例化的时候所调用的第一个方法
2. 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法
3. _new_ 决定是否要使用该 _init_ 方法,因为 _new_ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 _new_ 没有返回实例对象,则 _init_ 不会被调用
4. _new_ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string
_init_(self[, …])构造器,当一个实例被创建的时候调用的初始化方法
_del_(self)析构器,当一个实例被销毁的时候调用的方法
_call_(self[, args…])允许一个类的实例像函数一样被调用:x(a, b) 调用 x.call(a, b)
_len_(self)定义当被 len() 调用时的行为
_repr_(self)定义当被 repr() 调用时的行为
_str_(self)定义当被 str() 调用时的行为
_bytes_(self)定义当被 bytes() 调用时的行为
_hash_(self)定义当被 hash() 调用时的行为
_bool_(self)定义当被 bool() 调用时的行为,应该返回 True 或 False
_format_(self, format_spec)定义当被 format() 调用时的行为
  • 有关属性的魔法方法
魔法方法作用
_getattr_(self, name)定义当用户试图获取一个不存在的属性时的行为
_getattribute_(self, name)定义当该类的属性被访问时的行为
_setattr_(self, name, value)定义当一个属性被设置时的行为
_delattr_(self, name)定义当一个属性被删除时的行为
_dir_(self)定义当 dir() 被调用时的行为
_get_(self, instance, owner)定义当描述符的值被取得时的行为
_set_(self, instance, value)定义当描述符的值被改变时的行为
_delete_(self, instance)定义当描述符的值被删除时的行为

迭代器

通常我们使用for来进行迭代

  • iter()、next()
    一个容器对象调用iter(),就得到该容器的迭代器。使用next迭代器,得到下一个值,当抛出StopIteration异常,则表示迭代结束。
  • for的工作原理
string = 'luozheng'
it = iter(string)
while True:
    try:
        each = next(it)
    except StopIteration:
        break
    print(each)
  • _iter_()、_next_()
    如果一个容器如果是迭代器,则必须实现__iter()__的魔法方法,该方法实际上返回了迭代器自己的本身,也就是return self。而next定义了迭代规则。如以下例子,定义了斐波那契数列类:
class Fibs:
    def __init__(self, n=10):
        self.a = 0
        self.b = 1
        self.n = n
    def __iter__(self):
        return self
    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > self.n:
            raise  StopIteration
        return self.a

fibs = Fibs(20)
for each in fibs:
    print(each)
  • 容器类型
魔法方法作用
_len_(self)定义当被 len() 调用时的行为(返回容器中元素的个数)
_getitem_(self, key)定义获取容器中指定元素的行为,相当于 self[key]
_setitem_(self, key, value)定义设置容器中指定元素的行为,相当于 self[key] = value
_delitem_(self, key)定义删除容器中指定元素的行为,相当于 del self[key]
_iter_(self)定义当迭代容器中的元素的行为
_next_(self)定义当迭代容器中元素迭代规则
_reversed_(self)定义当被 reversed() 调用时的行为
_contains_(self, item)定义当使用成员测试运算符(in 或 not in)时的行为

算术运算

重写对象的运算方法,可以自定义一系列的运算。但是要注意以下问题:

  • 避免死循环,如以下NO.1的例子
  • 重写反运算要注意顺序问题
NO.1
"""
# 这个例子会出现死循环
class B_int(int):
    def __add__(self, other):
        return self + other
    def __sub__(self, other):
        return self - other
"""
class B_int(int):
    def __add__(self, other):
        return int(self) + int(other)
    def __sub__(self, other):
        return int(self) - int(other)


  • 算术运算符
魔法方法作用
_add_(self, other)定义加法的行为:+
_sub_(self, other)定义减法的行为:-
_mul_(self, other)定义乘法的行为:*
_truediv_(self, other)定义真除法的行为:/
_floordiv_(self, other)定义整数除法的行为://
_mod_(self, other)定义取模算法的行为:%
_divmod_(self, other)定义当被 divmod() 调用时的行为
_pow_(self, other[, modulo])定义当被 power() 调用或 ** 运算时的行为
_lshift_(self, other)定义按位左移位的行为:<<
_rshift_(self, other)定义按位右移位的行为:>>
_and_(self, other)定义按位与操作的行为:&
_xor_(self, other)定义按位异或操作的行为:^
_or_(self, other)定义按位或操作的行为:
  • 比较操作符
魔法方法作用
_lt_(self, other)定义小于号的行为:x < y 调用 x.lt(y)
_le_(self, other)定义小于等于号的行为:x <= y 调用 x.le(y)
_eq_(self, other)定义等于号的行为:x == y 调用 x.eq(y)
_ne_(self, other)定义不等号的行为:x != y 调用 x.ne(y)
_gt_(self, other)定义大于号的行为:x > y 调用 x.gt(y)
_ge_(self, other)定义大于等于号的行为:x >= y 调用 x.ge(y)
  • 反运算
魔法方法作用
_radd_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rsub_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rmul_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rtruediv_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rfloordiv_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rmod_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rdivmod_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rpow_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rlshift_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rrshift_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rand_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_rxor_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
_ror_(self, other)(与上方相同,当左操作数不支持相应的操作时被调用)
  • 增量赋值运算
魔法方法作用
_iadd_(self, other)定义赋值加法的行为:+=
_isub_(self, other)定义赋值减法的行为:-=
_imul_(self, other)定义赋值乘法的行为:*=
_itruediv_(self, other)定义赋值真除法的行为:/=
_ifloordiv_(self, other)定义赋值整数除法的行为://=
_imod_(self, other)定义赋值取模算法的行为:%=
_ipow_(self, other[, modulo])定义赋值幂运算的行为:**=
_ilshift_(self, other)定义赋值按位左移位的行为:<<=
_irshift_(self, other)定义赋值按位右移位的行为:>>=
_iand_(self, other)定义赋值按位与操作的行为:&=
_ixor_(self, other)定义赋值按位异或操作的行为:^=
_ior_(self, other)定义赋值按位或操作的行为:
  • 一元操作符
魔法方法作用
_pos_(self)定义正号的行为:+x
_neg_(self)定义负号的行为:-x
_abs_(self)定义当被 abs() 调用时的行为
_invert_(self)定义按位求反的行为:~x

其他魔法方法

  • 类型转换
魔法方法作用
_complex_(self)定义当被 complex() 调用时的行为(需要返回恰当的值)
_int_(self)定义当被 int() 调用时的行为(需要返回恰当的值)
_float_(self)定义当被 float() 调用时的行为(需要返回恰当的值)
_round_(self[, n])定义当被 round() 调用时的行为(需要返回恰当的值)
_index_(self)1. 当对象是被应用在切片表达式中时,实现整形强制转换
2. 如果你定义了一个可能在切片时用到的定制的数值型,你应该定义 _index_
3. 如果 _index_ 被定义,则 _int_ 也需要被定义,且返回相同的值
  • 上下文管理(with 语句)
魔法方法作用
_enter_(self)1. 定义当使用 with 语句时的初始化行为
2. _enter_ 的返回值被 with 语句的目标或者 as 后的名字绑定
_exit_(self, exc_type, exc_value, traceback)1. 定义当一个代码块被执行或者终止后上下文管理器应该做什么
2. 一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作

以上主要摘自鱼C

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python基础(十一)—魔法方法(构造析构、属性魔法、算数魔法、类型魔法等)

Python 魔法方法详解 什么是Python魔法方法    魔法方法就如同它的名字一样神奇,总能在你需要的时候为你提供某种方法来让你的想法实现。魔法方法是指Python内部已经包含的,被双下划线所包围的方法,这些方法在进行特定的操作时会自动被调用,它们是Python面向对象下智慧的结晶。初学者掌握Python的魔法方法也就变得尤为重要了。     为什么要使用Python魔法方法    使用Python的魔法... 阅读详情

相关推荐

Python魔法方法

从入门到进阶,一个很重要的点就是Python中的魔法方法,魔法方法就是可以给你的类增加魔力的特殊方法,如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。它们经常是两个下划线包围来命名的(比如__init__/__new__等等),Python的魔法方法是非常强大的。

一个专注于机器学习基础与实战的技术博客,内容涵盖算法推导、模型实现、数学原理与代码实践。用通俗的语言解析复杂概念,记录学习过程中的思考与总结,适合机器学习爱好者和从业者参考。 3356

Python:第9章面向对象程序设计 课后习题

《Python语言程序设计》刘卫国主编,中国工信出版集团,电子工业出版社 习题9 一、选择题 1.下列说法中不正确的是( )。D A.类是对象的模板,而对象是类的实例 B.实例属性名如果以__开头,就变成了一个私有变量 C.只有在类的内部才可以访问类的私有变量,外部不能访问 D.在Python中,一个子类只能有一个父类 2.下列选项中不是面向对象程序设计基本特征的是( )。C A.继承 B.多态 C.可维护性 D.封...

WHT869706733的博客 5942

《小甲鱼零基础入门学习Python》自学笔记(六)—— 魔法方法

魔法方法 一、Python 魔法方法详解 二、构造和析构 三、算术运算 四、属性访问 五、描述符 六、定制容器 七、迭代器 八、生成器

weixin_45017439的博客 458

python对象--魔法方法构造和析构

__init__方法 类启动就执行 返回值nil 不能返回值 __new__(cls)第一个参数不是self而是class, 在__init__之前被调用 __del__(self) 析构器 当垃圾回收机制回收会调用__del__方法 转载于:https://www.cnblogs.com/Purp1e/p/8136686.html...

weixin_33775582的博客 134

Python入门学习笔记(九)——魔法方法之构造器、析构器、算术运算

Python笔记(九) 目录 Python笔记(九) 魔法方法 构造与析构 __init__(self[,……]) __new__(cls[,…]) __del__(self) 算术运算 __add__(self,other) __sub__(self,other) 其他算数运算 反运算符 增量赋值运算 一元操作符 魔法方法 魔法方法总是被双下划线包围,例如:__init__ 魔法方法是面向对象的Python的一切 魔法方法的魔力,体现在它们总能在适当的时候被自动调用

咕噜君的博客 664

Coze平台智能体开发实战:打造测试工程师的AI助手

智能体是具备特定身份和能力的AI实体,由大语言模型(LLM)驱动,并通过插件、知识库和工作流扩展其能力。明确的角色定位:可以设定特定身份和专业领域扩展能力:通过插件连接外部工具和服务记忆能力:通过知识库存储和检索专属信息流程化处理:通过工作流执行复杂多步任务通过Coze平台创建测试工程师智能体,可以显著提升测试效率和质量。明确的角色定位:聚焦测试工程师的实际需求丰富的知识库:提供准确的领域知识支持合适的工具集成:通过插件连接现有工具链持续迭代优化:根据反馈不断改进智能体行为自动化测试生成。

hogwarts_beibei的博客 1005

构造方法和析构方法

构造方法和析构方法 construct  //当对象创建完成后第一个自动调用的方法 destruct  //当对象被释放后 最后一个自动调用的方法,作用:关闭一些资源,作一些清理工作 1 class Person { 2 public $name; 3 public $sex; 4 public $age; 5 public $score...

weixin_30449239的博客 152

WorkBuddy驱动SolidWorks实测:AI建模流程、参数化与许可排查指南

AI辅助三维建模正在改变工程师的重复劳动方式。其核心理念不是替代人的设计决策,而是通过AI智能体接管CAD软件中的草图绘制、特征创建、尺寸修改等高频操作,让工程师从繁琐的GUI交互中解放出来。在SolidWorks这类主流CAD平台上,这类AI助手的落地依赖环境稳定、需求描述清晰和参数化建模规范。通过将外径、孔距等关键尺寸定义为全局变量并用方程式驱动,可实现改一个数、模型自动更新的高效流程;同时,遇到“无法获得许可”等环境故障时,需要按服务状态、安全软件隔离、干净卸载的顺序排查。以WorkBuddy驱动So

weixin_28559803的博客 373

python 自定义类型_如何为 Python 基本类型自定义方法?

我们知道,字符串str、整型int、浮点数float是 Python 的三大基本数据类型。我们也知道,在 Python 里面,一切都是对象,而对象一般有方法。所以,大家会看到下面这种写法:a ='abcde'b = a.upper()print(b)其中的.upper()就是把字母转成大写的方法。我们在写自己的类时,常常会定义很多的方法。那么,当字符串自带的方法不够时,我们是否有办法自定义一些方法...

weixin_39614546的博客 470

SCI论文Discussion写作:如何用AI工具三步打造审稿人认可的深度逻辑框架

本文针对SCI论文Discussion写作的痛点,提出利用AI工具三步构建深度逻辑框架的方法。首先,使用Claude等工具搭建个性化提纲,解决“浅显病”与“混乱症”;其次,高效整合文献与结果,填充证据;最后,优化逻辑衔接与学术语言,打造审稿人认可的流畅论证。该方法强调研究者主导,AI辅助,显著提升写作效率与深度。

weixin_28235513的博客 236

Python 爬虫 + 数据分析:社会调查数据抓取与结果可视化分析

在当今数字化时代,数据已成为推动社会发展的关键资源之一。无论是市场调研、学术研究还是政策制定,社会调查数据都扮演着至关重要的角色。通过 Python 爬虫技术,我们可以高效地获取这些数据,并结合数据分析与可视化工具,深入挖掘数据背后的价值。本文将通过一个完整的实战项目,带你掌握如何使用 Python 爬虫抓取社会调查数据,并进行可视化分析。

yansideyucsdn的博客 126

Python基础——魔法方法(一)

Python中的魔法方法

薛定谔的猫的博客 1万+

【2026华为OD新规机考】最新套题持续更新【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】

可上练习华子OD、大厂真题绿色聊天软件戳od1441了解算法冲刺训练(备注【优快云】否则不通过)

weixin_48157259的博客 511

python 魔法方法简记

简单记录python中的魔法方法

well_fly的博客 848

医院批量排班实战指南(三)日期列表生成与时段批量操作

在上一篇《批量排班功能实现指南(二):日期与时段设置》中,我们完成了日期范围选择和重复规则配置的界面搭建,实现了从第一步到第二步的跳转功能。现在我们已经可以选择日期范围和重复规则,但还缺少最关键的功能——根据规则生成日期列表并进行时段配置。本篇将继续深入批量排班的核心功能——日期列表生成与时段批量操作。根据日期范围和重复规则智能生成日期列表为每个日期配置上午、下午、夜诊时段批量时段操作提升配置效率日期列表的展示与管理。

低代码布道师的博客 1347

【Kubernetes】Kubernetes 安全沙箱深度对比:gVisor vs Kata Containers

Kubernetes安全沙箱深度对比:gVisor和Kata Containers在架构、性能与安全性方面各有特点。gVisor通过用户态内核(Sentry)实现软件隔离,启动快(毫秒级)但CPU开销大(20-30%),适合Web服务等场景。Kata Containers采用轻量级虚拟机提供硬件级隔离,启动较慢(1-2秒)但兼容性更好,适合金融等高安全需求。测试显示gVisor在动态请求下性能下降33%,而Kata性能接近原生。建议根据场景选择:多租户/快速启动用gVisor,敏感数据/极致安全用Kata,

九师兄 178

python构造和析构_Python--25 魔法方法:构造和析构 魔法方法总结

魔法方法含义基本的魔法方法__new__(cls[, ...])1.__new__是在一个对象实例化的时候所调用的第一个方法2.它的第一个参数是这个类,其他参数是用来直接传递给__init__方法3. __new__ 决定是否要使用 该 __init__ 方法,因 为 __new__ 可以 调 用其他 类 的构造方法或者直接返回 别 的 实 例 对 象来作 为 本 类 的 实 例,如果 __new...

weixin_39808803的博客 112

DAF-Net:动态注意力红外-可见光图像融合

DAF-Net 红外-可见光融合链路:IR/VIS 双分支 (Conv+ResBlock → 64ch) → DynamicAttentionFusion (Cat→Sigmoid→加权) → 重建 (Conv→Sigmoid)。TNO 上 SSIM=0.782 (vs IR), 0.734 (vs VIS), 参数量仅 218K。核心贡献:轻量动态注意力门控, 无监督 SSIM+MSE 损失不需要配准 ground truth。

FJN110的博客 321

python:类3——魔法方法

&#13;  一、魔法方法特点 被双上下滑线包围 魔法方法是面向对象的Python的一切,如果你不知道魔法方法,说明你还没能意识到面向对象的Python的强大(不是说Python脚本) 通过对制定方法的重写,完全可以让python根据个人的用途去实现!   二、魔法方法 http://bbs.fishc.com/forum.php?mod=viewthread&amp;t...

daduryi的博客 515

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Python基础知识详解 从入门到精通(八)魔法方法

目录Python基础知识详解 从入门到精通(八)魔法方法什么是魔法方法基础魔法方法(较为常用)比较操作符算数运算符反运算(类似于运算方法)增量赋值运算一元操作符类型转换上下文管理(with 语句)定制容器 Python基础知识详解 从入门到精通(八)魔法方法 本篇主要是介绍python,内容可先看目录 其他基础知识详解,欢迎查看本人的其他文章 Python基础知识详解 从入门到精通(一)介绍 ...

GuanFuXin优快云的博客 1031

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[Python学习日记] 魔法方法(一)

[Python学习日记] 魔法方法目录构造和析构_ init_(self[,...])_ new_(cls[,...])_ del_(self)算数运算 目录 构造和析构 _ init_(self[,…]) _ init _(self[,…]) 实例 >>>class rectangle(x,y): def _init_(self,x,y): self.x=x...

weixin_44216855的博客 313

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python 类中魔法方法汇总

魔法方法 含义 基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法 3. __new__ 决定是否要使用该 __init__ 方法,因为 __new__ 可以...

xx117501的博客 994

(转)Python-魔法方法

Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切。 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的。 常见的魔法方法如下: 魔法方法 含义 ...

grace666的专栏 275

Python学习笔记 魔法方法全解

目录   - 前言   - 基本魔法方法   - 属性相关   - 比较操作符   - 算数运算符   - 反运算   - 增量赋值运算符   - 一元操作符   - 类型转换   - 上下文管理器   - 容器类型   - 一览表

dark_cy的博客 1071

Python 魔法方法

Python 打卡第十五天 观看完小甲鱼的讲解视频后,我了解到在构建模块后,通过建立一些系统提供的函数,可以达到更加完美便捷、而且更易理解的效果。 Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切。他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Py...

weixin_45571411的博客 149

python3基础知识复习 -- 魔法方法之构造,算数,属性定义

python3 面向对象编程之魔法方法构造

peanutfish的专栏 172
上一篇: Python基础(十)—面向对象的深入讲解(继承、Mixin编程机制等)
下一篇: Python基础(十三)—切片、yield、生成器、序列化JSON
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值