详解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 实现二叉搜索树的四种方法 二叉搜索树(Binary Search Tree,简称BST)是一棵二叉树,它具有以下性质: 若左子树不为空,则左子树上所有结点的值均小于它的根节点的值; 若右子树不为空,则右子树上所有结点的值均大于它的根节点的值; 左、右子树分别也为二叉搜索树; 没有键值相等的节点; 因其高效性,在排序、查找等问题中,常常使用二叉搜…

    python 2023年5月13日
    00
  • python数据预处理之将类别数据转换为数值的方法

    首先,对于将类别数据转换为数值数据,一般有两种方法:标签编码(Label Encoding)和独热编码(One-Hot Encoding)。下面分别介绍这两种方法的具体步骤及应用。 标签编码(Label Encoding) 1. 库的导入 from sklearn.preprocessing import LabelEncoder 2. 创建LabelEnc…

    python 2023年5月31日
    00
  • Python计算矩阵的和积的实例详解

    Python计算矩阵的和积的实例详解 在计算机科学和数学中,矩阵和积是一种常见的运算操作。在Python中,我们可以使用NumPy库来计算矩阵的和积。 第一步:导入NumPy库 在使用NumPy库之前,我们需要先导入它。 import numpy as np 第二步:创建矩阵 在计算矩阵的和积之前,我们需要先创建两个矩阵。这里我们以两个二维数组为例。 a =…

    python 2023年6月5日
    00
  • 以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法

    以下是详细讲解“以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法”的攻略。 简介 Pyspider是一个基于Python的web爬虫框架,可以用来进行数据抓取、数据处理和数据存储。本篇攻略将介绍Pyspider的基本使用方法,以及如何利用Pyspider实现搜索引擎的网络爬虫。 安装 使用Pyspider之前,需要先安装Pyspider及其…

    python 2023年5月14日
    00
  • Python必备技巧之函数的使用详解

    Python必备技巧之函数的使用详解 什么是函数 函数是一段可重复使用的代码块,它可以接受参数,执行一定的逻辑处理,然后返回值。在Python中,函数的定义是通过 def 关键字来实现的。 函数的定义 函数的定义通常包括以下几个部分: def function_name(parameters): """ Docstring. 对…

    python 2023年6月2日
    00
  • python让列表倒序输出的实例

    下面是关于如何让Python列表倒序输出的攻略: 方法1:使用reverse()方法 step 1: 定义一个普通的列表 lis = [1, 2, 3, 4, 5] step 2: 使用reverse()方法对整个列表进行倒序排列,并保存到一个新的列表中 new_list = lis[::-1] step 3:打印出新的列表, 即为正序的列表的倒序排列 pr…

    python 2023年6月5日
    00
  • Python开发编码规范

    Python开发编码规范的完整攻略 Python开发编码规范是指在Python开发过程中应该遵循的一些规范和约定。遵循编码规范可以提高代码的可读性、可维护性和可扩展性,从而提高代码的质量和效率。本文将详细讲解Python开发码规范的相关内容,包括命名规范、代码风格、注释规范等。 命名规范 在Python开中,命名规范是非常重要的。命名规范可以提高代码的可读性…

    python 2023年5月13日
    00
  • python如何快速拼接字符串

    当需要将多个字符串拼接成一个字符串时,Python提供了几种不同的方法来实现这个目标。下面是三种主要的方法,它们在不同的情况下适用。 1.使用”+”运算符拼接字符串 使用”+”运算符拼接字符串的方法非常直观和简单,python允许对两个字符串变量使用“+”运算符,这将把这两个字符串拼接成一个字符串。例如: s1 = "Hello" s2 …

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