首页 > 编程语言 >Python常用魔术方法汇总(20个魔法函数)

Python常用魔术方法汇总(20个魔法函数)

时间:2023-09-18 21:22:24浏览次数:33  
标签:__ 20 Python items self 魔法 other class def

本文将为您详细介绍Python中的让我们一起来了解这些特殊的函数,并提供一些在实际接口自动化工作中的示例代码。魔法函数(Magic Methods),也被称为特殊方法或双下划线方法,是Python中一些特殊命名的函数,它们以双下划线开头和结尾。这些函数定义了对象在特定情况下的行为,例如创建、比较、运算、迭代等。

 

Python魔法函数的作用

1、Python魔法函数主要是为某些特殊需求而设计的。例如__str__()和__repr__()函数用于打印输出对象的信息,__add__()函数用于定义两个对象相加的行为,__len__()函数定义当被len()调用时的行为等。

2、在Python中,大量使用魔法函数可以提高代码的可读性和可维护性,使开发更加方便快捷。

(Python魔法函数是实现Python语法糖的一种方式,可以更加方便快捷地编写代码,提高代码的可读性和可维护性。)

 

以下是20个常用的魔法函数及其功能的详细解释和示例代码:


__init__(self[, args...]):对象初始化函数,在创建对象时调用。

class MyClass:
    def __init__(self, name):
        self.name = name
obj = MyClass("Alice")

 

__str__(self):返回对象的字符串表示。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return f"({self.x}, {self.y})"
p = Point(3, 4)
print(p)  # 输出: (3, 4)

 

__len__(self):返回对象的长度。

class MyList:
    def __init__(self, items):
        self.items = items
    def __len__(self):
        return len(self.items)
my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list))  # 输出: 5

 

__getitem__(self, key):获取对象的指定元素。

class MyList:
    def __init__(self, items):
        self.items = items
    def __getitem__(self, index):
        return self.items[index]
my_list = MyList([1, 2, 3, 4, 5])
print(my_list[2])  # 输出: 3

 

__setitem__(self, key, value):设置对象的指定元素。

class MyList:
    def __init__(self, items):
        self.items = items
    def __setitem__(self, index, value):
        self.items[index] = value
my_list = MyList([1, 2, 3, 4, 5])
my_list[2] = 10
print(my_list.items)  # 输出: [1, 2, 10, 4, 5]

 

__delitem__(self, key):删除对象的指定元素。

class MyList:
    def __init__(self, items):
        self.items = items
    def __delitem__(self, index):
        del self.items[index]
my_list = MyList([1, 2, 3, 4, 5])
del my_list[2]
print(my_list.items)  # 输出: [1, 2, 4, 5]

 

__contains__(self, item):判断对象是否包含指定元素。

class MyList:
    def __init__(self, items):
        self.items = items
    def __contains__(self, item):
        return item in self.items
my_list = MyList([1, 2, 3, 4, 5])
print(3 in my_list)  # 输出: True

 

__iter__(self):返回迭代器对象。

class MyList:
    def __init__(self, items):
        self.items = items
    def __iter__(self):
        return iter(self.items)
my_list = MyList([1, 2, 3, 4, 5])
for item in my_list:
    print(item)  # 依次输出: 1, 2, 3, 4, 5

 

__next__(self):返回迭代器的下一个元素。

class MyList:
    def __init__(self, items):
        self.items = items
        self.index = 0
    def __iter__(self):
        return self
    def __next__(self):
        if self.index >= len(self.items):
            raise StopIteration
        value = self.items[self.index]
        self.index += 1
        return value
my_list = MyList([1, 2, 3, 4, 5])
for item in my_list:
    print(item)  # 依次输出: 1, 2, 3, 4, 5

 

__eq__(self, other):判断两个对象是否相等。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y
p1 = Point(3, 4)
p2 = Point(3, 4)
print(p1 == p2)  # 输出: True

 

__lt__(self, other):判断一个对象是否小于另一个对象。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __lt__(self, other):
        return self.x < other.x and self.y < other.y
p1 = Point(2, 3)
p2 = Point(3, 4)
print(p1 < p2)  # 输出: True

 

__gt__(self, other):判断一个对象是否大于另一个对象。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __gt__(self, other):
        return self.x > other.x and self.y > other.y
p1 = Point(3, 4)
p2 = Point(2, 3)
print(p1 > p2)  # 输出: True

 

__add__(self, other):定义对象的加法操作。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
result = v1 + v2
print(f"({result.x}, {result.y})")  # 输出: (4, 6)

 

__sub__(self, other):定义对象的减法操作。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)
v1 = Vector(3, 4)
v2 = Vector(1, 2)
result = v1 - v2
print(f"({result.x}, {result.y})")  # 输出: (2, 2)

 

__mul__(self, other):定义对象的乘法操作。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __mul__(self, factor):
        return Point(self.x * factor, self.y * factor)
p = Point(2, 3)
result = p * 2
print(f"({result.x}, {result.y})")  # 输出: (4, 6)

 

__call__(self[, args...]):使对象可调用。

class Calculator:
    def __call__(self, a, b):
        return a + b
calc = Calculator()
result = calc(3, 4)
print(result)  # 输出: 7

 

__enter__(self) 和 __exit__(self, exc_type, exc_value, traceback):定义上下文管理器。

class FileManager:
    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_value, traceback):
        self.file.close()
with FileManager("example.txt") as file:
    contents = file.read()
    print(contents)

 

__getattr__(self, name):在访问不存在的属性时调用。

class Person:
    def __getattr__(self, name):
        return f"Attribute '{name}' does not exist."
p = Person()
print(p.age)  # 输出: Attribute 'age' does not exist.


__setattr__(self, name, value):在设置属性值时调用。
class Person:
    def __setattr__(self, name, value):
        print(f"Setting attribute '{name}' to '{value}'")
        super().__setattr__(name, value)
p = Person()
p.name = "Alice"  # 输出: Setting attribute 'name' to 'Alice'

 

__delattr__(self, name):在删除属性时调用。

class Person:
    def __delattr__(self, name):
        print(f"Deleting attribute '{name}'")
        super().__delattr__(name)
p = Person()
del p.name  # 输出: Deleting attribute 'name'

标签:__,20,Python,items,self,魔法,other,class,def
From: https://www.cnblogs.com/wyl-520/p/17713081.html

相关文章

  • Python成员方法、类方法与静态方法的区别
    Python基础教程:3个方面理解Python的类方法与静态方法在Python语言中有如下3种方法:成员方法类方法(classmethod)静态方法(staticmethod)可能很多同学不清楚这3种方法,尤其是后两类方法到底有什么不同。为此,本文将对这3种方法做一次敲骨沥髓的深度剖析。先说一下这3种方法的差异,......
  • [HUBUCTF 2022 新生赛]ezPython
    附件链接:https://wwvc.lanzouj.com/iIqq218z5x0d给了一个pyc文件利用命令将pyc转换为py文件uncompyle6ezPython.pyc>ezPython.py打开py文件#uncompyle6version3.9.0#Pythonbytecodeversionbase3.7.0(3394)#Decompiledfrom:Python3.8.2(tags/v3.8.2:7b3ab......
  • abc320f <dp >
    题目F-FuelRoundTrip总结关键在于状态的定义。因为每个位置尽可加油一次,因此往返会相互影响,因而必须考考虑状态中定义去时经过此地的油量j与回时经过此地的油量k,这样才能成功转移;此外,本题状态转移比较奇特,相邻两个位置的状态的转移,在时间上包含去和回两个不同的时刻,较难......
  • python学习计划
    首先我要去购买《Python编程,从入门到实践》这本书来学习python这门课程首先第一个月我要学习python的基础知识第一周:了解Python的基础,包括变量、数据类型、运算符和基本输入/输出。第二周:学习条件语句(if、elif、else)和循环(for、while)。第三周:掌握Python的函数和参数传递。第......
  • 2023CSP-J游寄
    Day-3水帖。Day-2水帖(寒)。Day-1还是水帖。。。Day0考前在比赛开始前水了会帖。。。星期六基本都在补课,早上的课请了假。跑到三楼的\(304\)考场,小学生扎堆。考中感觉今年比较简单一点点。有些不会的题都蒙对了。考完后的一个小时都在摆烂,也就翻翻卷子,看看时间,无......
  • hmac:Python密码消息签名
    前言HMAC算法可以用于验证信息的完整性,这些信息可能在应用之间传递,或者存储在一个可能有安全威胁的地方。其基本思路:生成实际数据的一个密码散列,并提供一个共享的秘密密钥。然后使用得到的散列检查所传输或存储的信息,以确定一个信任级别,而不传输秘密密钥。消息签名hmac库提供......
  • The 2023 ICPC Asia Regionals Online Contest (1) ADI
    The2023ICPCAsiaRegionalsOnlineContest(1)AQualifiersRankingRules思路:按位次为第一关键字,场次为第二关键字排序即可。//AConemoretimes//nndbk#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintmod=1e9+7;constintN......
  • Python中数据类转换为JSON的方法
    dataclass到Python中的JSONJavaScriptObjectNotation或JSON表示使用编程语言中的文本组成的脚本(可执行)文件来存储和传输数据。Python通过JSON内置模块支持JSON。因此,我们在Python脚本中导入JSON包,以利用这一能力。JSON中使用的引号字符串包含了键值映射中的值。它与Pytho......
  • Python教程:@符号的用法
    @符号在Python中最常见的使用情况是在装饰器中。一个装饰器可以让你改变一个函数或类的行为。@符号也可以作为一个数学运算符使用,因为它可以在Python中乘以矩阵。本教程将教你如何使用Python的@符号。装饰器中使用@符号装饰器是一个接受一个函数作为参数的函数,向其添加......
  • Python中装饰器的顺序
    什么是装饰器,它们如何被使用,以及我们如何利用它们来构建代码。我们将看到装饰器是如何成为一个强大的工具,可以用来为我们的应用程序添加功能,并且可以在Python编程语言中找到。装饰器顺序在Python中,装饰器是一个特殊的函数,可以修改另一个函数的行为。装饰器是一种设计模式,它在不......