详解Python常用的魔法方法

好的。下面就给大家详细地讲一下 Python 常用的魔法方法。

Python 常用的魔法方法

什么是魔法方法?

魔法方法是一种 Python 中特殊的方法,可以在类的实例化、运算符重载、属性调用等环节中进行自定义操作。

在 Python 中,官方定义了一些魔法方法(以双下划线作为前缀和后缀的方法名),如 __init__(), __add__() 等等,这些方法会在特定的情况下被 Python 自动调用,以完成特定的操作。

魔法方法的分类

魔法方法可以分为以下几类:

  • 构造方法:__init__()
  • 魔法方法:__repr__(), __str__()
  • 运算符重载:__add__(), __sub__(), __mul__(), __truediv__()等等
  • 属性访问:__getattr__(), __setattr__(), __delattr__()等等
  • 容器类型:__len__(), __getitem__(), __setitem__(), __delitem__(), __iter__()等等

构造方法

构造方法是一种特殊的方法,用于在创建类的实例时,给这个实例初始化一些属性。在 Python 中,构造方法的方法名是 __init__()

示例代码如下:

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

person = Person("张三", 18)
print(person.name)  # 张三
print(person.age)   # 18

魔法方法

__repr__() 方法

__repr__() 方法用于返回一个对象的字符串表示形式,该字符串表示形式可以用来重新创建该对象。如果我们想要自定义一个对象的字符串表示形式,可以重载该方法。

示例代码如下:

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

    def __repr__(self):
        return f"{self.name}({self.age})"

person = Person("张三", 18)
print(person)  # 张三(18)

__str__() 方法

__str__() 方法用于返回一个对象的字符串表示形式,当我们使用 print 函数打印一个对象时,就是调用的该方法。如果我们想要自定义一个对象的打印形式,可以重载该方法。

示例代码如下:

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

    def __str__(self):
        return f"{self.name}({self.age})"

person = Person("张三", 18)
print(person)  # 张三(18)

运算符重载

Python 中的运算符重载,就是通过魔法方法来自定义对象在特定情况下的运算方式。

__add__() 方法

__add__() 方法用于重载加号运算符 +,可以让两个对象相加时,返回我们自定义的结果。

示例代码如下:

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

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

person1 = Person(18)
person2 = Person(20)
print(person1 + person2)  # 38

__lt__()__gt__() 方法

__lt__()__gt__() 方法分别用于重载小于号运算符 < 和大于号运算符 >,可以让 Python 对象之间能够进行大小比较。

示例代码如下:

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

    def __lt__(self, other):
        return self.age < other.age

    def __gt__(self, other):
        return self.age > other.age

person1 = Person(18)
person2 = Person(20)
print(person1 < person2)  # True
print(person2 > person1)  # True

属性访问

在 Python 中,我们可以通过 . 符号来访问对象的属性,但是如果我们想要自定义对象的属性访问方式,可以通过魔法方法来实现。

__getattr__() 方法

当我们访问一个对象的不存在的属性时会触发 __getattr__() 方法。

示例代码如下:

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

    def __getattr__(self, item):
        if item == "age":
            return 18
        else:
            return None

person = Person("张三")
print(person.age)    # 18
print(person.gender) # None

__setattr__() 方法

当我们给对象设置属性值时会触发 __setattr__() 方法。

示例代码如下:

class Person:
    def __setattr__(self, key, value):
        print(f"设置属性 {key} 为 {value}")
        self.__dict__[key] = value

person = Person()
person.age = 18  # 设置属性 age 为 18

__delattr__() 方法

当我们删除一个对象的属性时会触发 __delattr__() 方法。

示例代码如下:

class Person:
    def __init__(self):
        self.age = 18

    def __delattr__(self, item):
        print(f"删除属性 {item}")
        del self.__dict__[item]

person = Person()
del person.age  # 删除属性 age

容器类型

在 Python 中,像列表、字典等容器类型都有一些常用的魔法方法。

__len__() 方法

__len__() 方法用于返回容器类型对象的长度(即元素的个数)。

示例代码如下:

class MyList:
    def __init__(self):
        self.items = []

    def add(self, item):
        self.items.append(item)

    def __len__(self):
        return len(self.items)

my_list = MyList()
my_list.add(1)
my_list.add(2)
my_list.add(3)
print(len(my_list))  # 3

__getitem__()__setitem__() 方法

__getitem__()__setitem__() 方法分别用于访问和设置容器类型对象中指定下标的元素。

示例代码如下:

class MyList:
    def __init__(self):
        self.items = []

    def add(self, item):
        self.items.append(item)

    def __getitem__(self, index):
        return self.items[index]

    def __setitem__(self, index, value):
        self.items[index] = value

my_list = MyList()
my_list.add(1)
my_list.add(2)
my_list.add(3)
print(my_list[0])  # 1
my_list[0] = 10
print(my_list[0])  # 10

到此,本文讲解了 Python 常用的魔法方法,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python常用的魔法方法 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • python网络编程之进程详解

    Python网络编程之进程详解 在Python中,进程是一种常见的并发编程技术,它可以帮助我们更好地利用计算机的多核能力提高程序的效率和性能。本文将为您提供详细的Python网络编程之进程的完整攻略,包括如何创建进程、如何启动和停止进程、如何使用进程池等。 创建进程 在Python中,我们可以使用multiprocessing模块来创建进程。以下是一个示例,…

    python 2023年5月14日
    00
  • 了不起的修仙模拟器在世真仙出门历练方法详解

    了不起的修仙模拟器在世真仙出门历练方法详解 背景 在了不起的修仙模拟器游戏中,除了修炼提升修为,世真仙也要出门历练,才能获得更多的修仙资源和任务,提高自身实力。本文将详细介绍世真仙在出门历练过程中的方法及注意事项。 出门历练方法 选择目的地 在出门历练前,首先需要选择一个适合自己修为等级和实力的目的地。可以通过查看地图和目的地介绍,了解不同地方的资源和危险程…

    python 2023年6月3日
    00
  • Python解析Excle文件中的数据方法

    下面是Python解析Excel文件中的数据方法的完整实例教程: 1. 安装依赖库 在Python中解析Excel文件需要使用到openpyxl库,可以通过以下命令进行安装: pip install openpyxl 2. 读取Excel文件 读取Excel文件可以使用openpyxl库中的load_workbook函数。该函数接收Excel文件的路径,然后…

    python 2023年5月13日
    00
  • Python实现常见的4种坐标互相转换

    Python实现常见的4种坐标互相转换是一个比较基础而且实用的技能,在各种应用场景当中都有应用。这里为大家详细讲解实现这种功能的攻略。 坐标系 在开始之前,先来回顾一下坐标系的概念。通常我们所说的坐标系都是二维坐标系,由水平方向X轴和垂直方向Y轴组成。在这个坐标系中的每一个点都可以用一个二元组(x, y)表示。例如(0, 0)代表坐标系的原点,(1, 1)代…

    python 2023年6月3日
    00
  • 在python中利用opencv简单做图片比对的方法

    安装opencv 首先需要安装OpenCV,可以通过命令行或者Anaconda Prompt输入以下命令进行安装: pip install opencv-python 导入库 导入库OpenCV,并载入两张待比对的图片 import cv2 img1 = cv2.imread(‘image1.jpg’) img2 = cv2.imread(‘image2.j…

    python 2023年5月18日
    00
  • python 列表的查询操作和切片

    Python列表的查询操作和切片 在Python中,列表(list)是一种常用的数据结构,它可以存储多个元素。本文将详细讲解Python列表的查询操作和切片,以及如使用它们来获取列表中的元素。 查询操作 index()方法 我们可以使用index()方法来查找列表中指定元素下标。例如,要查找列表my_list中元素3的下标,可以使用下面的代码: my_lis…

    python 2023年5月13日
    00
  • 简单介绍一下pyinstaller打包以及安全性的实现

    下面我来详细讲解一下在使用PyInstaller打包Python程序时如何实现安全性。 什么是PyInstaller PyInstaller是将Python应用程序打包成单个可执行文件的工具。它支持各种操作系统,包括Windows、Linux和Mac OS X等。PyInstaller不需要安装任何额外的组件或库。它能够自动识别和打包Python应用程序所依…

    python 2023年5月13日
    00
  • Python 读写文件的操作代码

    Python可以通过内置的文件操作函数,在程序中对文件进行读写、复制等操作。下面是Python读写文件的基本操作代码攻略: 1. 打开文件 Python中打开一个文件需要使用 open 函数。这个函数接收文件名和打开方式两个参数。打开方式为可选参数,默认为只读方式 “r”,其他常见模式包括写入 “w”,追加 “a”,二进制方式 “b” 等。 语法: open…

    python 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部