详解Python常用的魔法方法

yizhihongxing

好的。下面就给大家详细地讲一下 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 的除法运算 在Python中,除法运算符 / 用于计算两个数相除得到的结果。例如: 5 / 2 # 输出 2.5 在整数除法的场景中,P…

    python 2023年6月3日
    00
  • Python读取pdf表格写入excel的方法

    下面是Python读取pdf表格写入excel的方法的完整实例教程。 1. 环境准备 首先,我们需要安装三个Python库,分别是pdfplumber、openpyxl和os,可以通过pip命令安装: !pip install pdfplumber !pip install openpyxl 2. 实现步骤 接下来,我们具体来看如何使用Python实现读取p…

    python 2023年5月13日
    00
  • 总结的几个Python函数方法设计原则

    下面我来详细讲解一下“总结的几个Python函数方法设计原则”的完整攻略。 标题 在阐述这个问题之前,我们先来看一下什么是函数方法设计原则。 正文 函数方法设计原则 函数是程序中有用的编程结构,它可以把一段代码作为独立的单元进行封装和调用。而函数方法设计就是为了让我们写出高质量、易于维护的函数。 在Python中,函数和方法的设计原则也是一样的,我们可以总结…

    python 2023年6月5日
    00
  • 基于python时间处理方法(详解)

    基于Python的时间处理方法(详解) Python是一种流行的编程语言,其中一个强大的功能就是能够处理时间。在本文中,将会详细讲解基于Python的时间处理方法。 日期和时间 在Python中,时间通常使用datetime库来处理。该库包含了许多实用程序函数,用于操作日期和时间。 获取当前日期和时间 要获取当前日期和时间,可以使用以下代码: import …

    python 2023年6月2日
    00
  • python3基础之集合set详解

    Python3基础之集合Set详解 1. 什么是集合? 在Python中,集合(set)是一种无序且拥有唯一元素的数据类型。它的元素不能重复。 集合是由大括号{}或set()函数来创建的。 例如: >>> s = {1, 2, 3} >>> type(s) <class ‘set’> >>> …

    python 2023年5月13日
    00
  • python实现csdn全部博文下载并转PDF

    下面就为你详细讲解“Python实现CSDN全部博文下载并转PDF”的完整攻略。 1. 准备工作 在开始操作之前,我们需要准备以下工具和库: Python3:需要先安装Python3环境; requests库:用于发送网络请求; BeautifulSoup4库:用于解析HTML页面的内容; pdfkit库:用于将HTML页面转换为PDF文件。 其中,requ…

    python 2023年5月20日
    00
  • 如何在 Redis 中实现分布式缓存?

    以下是详细讲解如何在 Redis 中实现分布式缓存的完整使用攻略。 Redis 分布式缓存简介 Redis 分布式缓存是一种常用的缓存技术,可以用于提高系统的能响应速度。Redis 分布式缓存的特点如下: Redis 分布式缓存是基于 Redis 的缓存技术实现。 Redis 分布式缓存可以通过多个 Redis 节点实现数据的分布式存储。 Redis 分布式…

    python 2023年5月12日
    00
  • python中partial()基础用法说明

    Python中partial()基础用法说明 Python中的partial函数是一个非常有用的函数,可以帮助我们基于现有的函数,创建新的函数。它可以理解为“部分应用”一个函数,就是将部分参数传入一个函数,但并不立即执行它,而是返回一个新的函数,这个新函数可以继续接收剩余的参数,并最终返回结果。 它的基本语法 下面是partial函数的基本语法格式: fun…

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