Python魔法函数(Magic Methods简介

在 Python 中,魔法函数(Magic Methods)也称为双下划线方法(Dunder Methods),是指那些名字以双下划线开头和结尾的特殊方法。 这些方法可以让您的自定义类实现一些特定的行为,从而与 Python 的内置类型和操作进行交互。

例如,`init` 方法用于对象的初始化,`str` 方法用于定义对象的字符串表示形式,`add` 方法用于实现对象的加法操作等。

以下是一些常见魔法函数的示例及其作用:

  1. `init`:在创建对象时自动调用,用于初始化对象的属性。
python 复制代码
class MyClass:
    def __init__(self, value):
        self.value = value

例子:创建"Student"类,对应逻辑关系:

Student→self→{name,age,grade}(三个逻辑分支)

python 复制代码
# 创建学生对象
student1 = Student("Alice", 12, 6)
#类的实例化
python 复制代码
class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade

# 创建学生对象
student1 = Student("Alice", 12, 6)
print(student1.name)  
print(student1.age)  
print(student1.grade)  
  1. `str`:定义对象的字符串表示,当使用 `str()` 函数或在打印对象时调用。
python 复制代码
class MyClass:
    def __str__(self):
        return f"MyClass with value: {self.value}"

例子:

python 复制代码
class MyClass:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"My value is {self.value}"

my_object = MyClass(42)
print(str(my_object))  

在这段代码中,`42` 这个值的传递关系如下: 当创建对象 `my_object = MyClass(42)` 时,`42` 作为参数被传递给了 `MyClass` 类的 `init` 方法。 在 `init` 方法内部,`42` 被赋值给了对象的 `self.value` 属性,使得该对象具有了 `value` 属性且其值为 `42` 。 当执行 `str(my_object)` 或 `print(my_object)` 时,会调用 `str` 方法,在 `str` 方法中通过 `self.value` 访问到了之前存储的 `42` 值,并将其用于生成返回的字符串 `My value is 42` 。 简单来说,`42` 从创建对象时作为参数传入,被存储在对象的属性中,然后在需要时被 `str` 方法获取并使用。

  1. `add`:实现对象的加法操作。
python 复制代码
class MyNumber:
    def __init__(self, num):
        self.num = num

    def __add__(self, other):
        return MyNumber(self.num + other.num)

例子:

python 复制代码
class MyNumber:
    def __init__(self, num):
        self.num = num

    def __add__(self, other):
        return MyNumber(self.num + other.num)

num1 = MyNumber(5)
num2 = MyNumber(3)
result = num1 + num2
print(result.num)  
  1. `len`:用于 `len()` 函数获取对象的长度。
python 复制代码
class MyList:
    def __init__(self, items):
        self.items = items

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

例子:

python 复制代码
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))  

通过合理地定义魔法函数,可以使自定义类的行为更加自然和符合 Python 的习惯用法。

以下是一些常见的 Python 魔法函数及它们的作用:

  1. `init(self,...)`:对象初始化函数,在创建对象时调用,用于进行对象的初始化操作。

  2. `str(self)`:直接打印对象的实现方法,被`print`函数调用,返回对象的字符串表示。

  3. `new(cls, *args, **kwargs)`:在对象实例化时首先被调用,用于创建并返回实例对象。

  4. `unicode(self)`:在一个对象上调用`unicode()`时被调用,常用于 Django 模型中处理字符串。

  5. `call(self, *args, **kwargs)`:允许一个类的实例像函数一样被调用。

  6. `len(self)`:定义当被`len()`调用时的行为,需要返回一个整数,表示对象的长度。

  7. `repr(self)`:用于将值转化为供解释器读取的形式,如果对象没有适于人阅读的解释形式,`str()`会返回与`repr()`相同的内容。

  8. `setattr(self, name, value)`:可以设置对象的属性。

  9. `getattr(self, name)`:获取对象属性,在属性没有找到时被调用。

  10. `getattribute(self, name)`:无条件地获取对象属性,可用于做一些控制,但定义后`getattr`不再自动调用,除非显式调用。

  11. `delattr(self, name)`:用于删除对象的属性。

  12. `setitem(self, key, value)`:实现该函数后,可以以下标的方式给对象赋值。

  13. `getitem(self, key)`:可以使对象支持以下标的方式获取值。

  14. `delitem(self, key)`:支持以下标方式删除对象数据。

  15. `iter(self)`:只要定义了该方法,对象就可以使用迭代器访问,意味着可以迭代自定义的对象。

  16. `del(self)`:析构器或回收器,在对象引用数降到 0 时执行,但执行时间可能不确定,一般不推荐使用,可用于实现一些非紧急但必须要做的事。

  17. `eq(self, other)`:定义等于号的行为,用于判断两个对象是否相等。

  18. `lt(self, other)`:定义小于号的行为,用于判断一个对象是否小于另一个对象。

  19. `gt(self, other)`:定义大于号的行为,用于判断一个对象是否大于另一个对象。

  20. `add(self, other)`:定义加法操作的行为。

  21. `sub(self, other)`:定义减法操作的行为。

  22. `mul(self, other)`:定义乘法操作的行为。

  23. `truediv(self, other)`:定义真除法操作的行为。

  24. `floordiv(self, other)`:定义整数除法操作的行为。

  25. `mod(self, other)`:定义取模算法的行为。

  26. `pow(self, other, modulo)`:定义当被`power()`调用或 `**` 运算时的行为。

  27. `radd(self, other)`等(反运算魔法方法):当左操作数不支持相应的操作时被调用,例如`radd`在执行`other + self`时被调用。

  28. `iadd(self, other)`等(增量赋值运算魔法方法):定义相应的增量赋值运算行为,如`iadd`定义`+=`的行为。

  29. `neg(self)`:定义正号的行为。

  30. `pos(self)`:定义负号的行为。

  31. `abs(self)`:定义当被`abs()`调用时的行为。

  32. `invert(self)`:定义按位求反的行为。

  33. `complex(self)`:定义当被`complex()`调用时的行为,需要返回恰当的值。

  34. `int(self)`:定义当被`int()`调用时的行为,需要返回恰当的值。

  35. `float(self)`:定义当被`float()`调用时的行为,需要返回恰当的值。

  36. `round(self, n)`:定义当被`round()`调用时的行为,需要返回恰当的值。

  37. `index(self)`:当对象应用在切片表达式中时,实现强制转换;如果定义了该方法,则也需要定义`int`且返回相同的值。

魔法函数可以让自定义类具有更丰富的行为,类似于 Python 内置类型的操作方式,从而使代码更加简洁、易读和可维护。它们的具体使用方式和效果取决于具体的需求和上下文。在实际编程中,根据需要选择合适的魔法函数来定制类的行为。

相关推荐
深蓝海拓4 分钟前
Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用
数据库·python·qt·pyqt
无须logic ᭄12 分钟前
CrypTen项目实践
python·机器学习·密码学·同态加密
百流24 分钟前
scala文件编译相关理解
开发语言·学习·scala
Channing Lewis25 分钟前
flask常见问答题
后端·python·flask
Channing Lewis27 分钟前
如何保护 Flask API 的安全性?
后端·python·flask
水兵没月1 小时前
钉钉群机器人设置——python版本
python·机器人·钉钉
Evand J2 小时前
matlab绘图——彩色螺旋图
开发语言·matlab·信息可视化
我想学LINUX2 小时前
【2024年华为OD机试】 (A卷,100分)- 微服务的集成测试(JavaScript&Java & Python&C/C++)
java·c语言·javascript·python·华为od·微服务·集成测试
深度混淆2 小时前
C#,入门教程(04)——Visual Studio 2022 数据编程实例:随机数与组合
开发语言·c#