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 内置类型的操作方式,从而使代码更加简洁、易读和可维护。它们的具体使用方式和效果取决于具体的需求和上下文。在实际编程中,根据需要选择合适的魔法函数来定制类的行为。

相关推荐
神奇夜光杯5 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue7 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧9 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
千天夜17 分钟前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
测试界的酸菜鱼20 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
羊小猪~~24 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
晨曦_子画30 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend38 分钟前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
放飞自我的Coder1 小时前
【python ROUGE BLEU jiaba.cut NLP常用的指标计算】
python·自然语言处理·bleu·rouge·jieba分词
希言JY1 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言