一文带你深入理解Python魔法方法

 更新时间:2023年06月26日 09:49:30   作者:小小张说故事  
在Python中,魔法方法是指那些以双下划线开头和结尾的特殊方法,它们是Python的内置方法,对应于Python对象的各种运算符,这篇文章将深入探讨Python的一些魔法方法,并通过示例展示如何使用它们,需要的朋友可以参考下

一、构造和初始化

__new__ 和 __init__ 是 Python 对象生命周期的开始。__new__ 方法是在一个对象实例化的时候所调用的第一个方法,在调用 __init__ 初始化前,先调用 __new__

class MyClass:
    def __new__(cls, *args, **kwargs):
        print('Instance is created')
        instance = super().__new__(cls)
        return instance
    def __init__(self, name):
        print('Instance is initialized')
        self.name = name
obj = MyClass('MyClass')  # 输出:Instance is created Instance is initialized

二、字符串表示

__str__ 和 __repr__ 都是用于显示的魔法方法。__str__ 是友好易读的方式呈现,而 __repr__ 是准确、无歧义地表达出来,主要供开发和调试时使用。

class MyClass:
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return f'Instance of MyClass with name {self.name}'
    def __repr__(self):
        return f'MyClass(name={self.name})'
obj = MyClass('MyClass')
print(str(obj))  # 输出:Instance of MyClass with name MyClass
print(repr(obj))  # 输出:MyClass(name=MyClass)

三、算术运算符

魔法方法还可以用来定义对象的算术运算行为,例如 __add____sub____mul__ 等。

class Number:
    def __init__(self, value):
        self.value = value
    def __add__(self, other):
        return self.value + other.value
num1 = Number(1)
num2 = Number(2)
print(num1 + num2)  # 输出:3

四、比较运算符

比较运算符的魔法方法包括 __lt____le____eq____ne____gt____ge__ 等。

class Number:
    def __init__(self, value):
        self.value = value
    def __lt__(self, other):
        return self.value < other.value
num1 = Number(1)
num2 = Number(2)
print(num1 < num2)  # 输出:True

五、属性访问

当我们试图访问一个对象的属性时,__getattr____setattr____delattr____getattribute__ 魔法方法就会被调用。__getattribute__ 方法是用于获取一个属性的值,而 __setattr__ 是在我们试图设置一个属性值时被调用。

class MyClass:
    def __init__(self):
        self.name = 'MyClass'
    def __getattribute__(self, item):
        if item == 'name':
            print('Accessing name attribute')
        return object.__getattribute__(self, item)
    def __setattr__(self, key, value):
        print(f'Setting attribute {key} with value {value}')
        self.__dict__[key] = value
obj = MyClass()
print(obj.name)  # 输出:Accessing name attribute MyClass
obj.name = 'New name'  # 输出:Setting attribute name with value New name

六、上下文管理器

上下文管理器是通过 __enter__ 和 __exit__ 魔法方法实现的,它们通常在 with 语句中使用。

class ManagedFile:
    def __init__(self, filename):
        self.filename = filename
    def __enter__(self):
        self.file = open(self.filename, 'r')
        return self.file
    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.file:
            self.file.close()
with ManagedFile('hello.txt') as f:
    content = f.read()
print(content)

在这个例子中,__enter__ 方法打开文件并返回,__exit__ 方法在离开 with 块时被调用,负责关闭文件。

七、结论

Python 的魔法方法为我们提供了改变对象行为的强大工具,让我们能够以符合 Python 风格的方式去操作和处理对象。同时,理解并掌握这些魔法方法也是成为高级 Python 程序员的必经之路。

到此这篇关于一文带你深入理解Python魔法方法的文章就介绍到这了,更多相关Python魔法方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python操作mysql实现一个超市管理系统

    python操作mysql实现一个超市管理系统

    超市管理系统有管理员和普通用户两条分支,只需掌握Python基础语法,就可以完成这个项目,下面这篇文章主要给大家介绍了关于python操作mysql实现一个超市管理系统的相关资料,需要的朋友可以参考下
    2022-12-12
  • 基于python 将列表作为参数传入函数时的测试与理解

    基于python 将列表作为参数传入函数时的测试与理解

    这篇文章主要介绍了基于python 将列表作为参数传入函数时的测试与理解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • flask的orm框架SQLAlchemy查询实现解析

    flask的orm框架SQLAlchemy查询实现解析

    这篇文章主要介绍了flask的orm框架SQLAlchemy查询实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 如何给Python代码进行加密

    如何给Python代码进行加密

    这篇文章主要介绍了如何给Python代码进行加密,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 解决使用pycharm提交代码时冲突之后文件丢失找回的方法

    解决使用pycharm提交代码时冲突之后文件丢失找回的方法

    这篇文章主要介绍了解决使用pycharm提交代码时冲突之后文件丢失找回的方法 ,需要的朋友可以参考下
    2018-08-08
  • python游戏库pygame经典教程(推荐!)

    python游戏库pygame经典教程(推荐!)

    Python Pygame是一款专门为开发和设计 2D 电子游戏而生的软件包,是入门级游戏开发库,下面这篇文章主要给大家介绍了python游戏库pygame经典教程的相关资料,需要的朋友可以参考下
    2022-12-12
  • 在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1的详细步骤

    在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1的

    这篇文章主要介绍了如何在linux系统中安装python3.8.1 并卸载 python3.6.2 更新python3引导到3.8.1,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11
  • Python Web Flask扩展开发指南分享

    Python Web Flask扩展开发指南分享

    这篇文章主要介绍了Python Web Flask扩展开发指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • Django返回json数据用法示例

    Django返回json数据用法示例

    这篇文章主要介绍了Django返回json数据用法,结合实例形式分析了jQuery通过前端ajax发送get请求及后台使用Django接收GET请求并返回处理的json数据相关技巧,需要的朋友可以参考下
    2016-09-09
  • python邮件发送smtplib使用详解

    python邮件发送smtplib使用详解

    这篇文章主要为大家详细介绍了python邮件发送smtplib的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论