说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的特殊方法(有人称魔术方法)是由 Python 解释器调用的,一般情况下,我们不需要直接调用它,使用它们者是用内置函数和操作符。比如,很多对象在实现特殊方法__len__()
后,我们只需使用 len(x) 即可调用。
Python 保留的影响对象高层次行为和与操作符交互行为的实例方法,这些方法被称为特殊方法(special method)。 魔术方法(magic method)是它的非正式叫法。特殊方法一种由 Python 隐式调用的方法,用来对某个类型执行特定操作例如相加等等。这种方法的名称的首尾都为双下划线(Dunder,Double Underscore)。
一个类可以通过定义具有特殊名称的方法来实现由特殊语法(例如算术运算或下标和切片)调用的某些操作。 这是 Python 的运算符重载方法,允许类根据语言运算符定义自己的行为。 例如,如果一个类定义了一个名为 __getitem__()
的方法,而 x 是该类的一个实例,那么 x[i]
大致等价于 type(x).__getitem__(x, i)
。 除非另有说明,否则在未定义适当的方法(通常是 AttributeError 或 TypeError)时,尝试执行操作会引发异常。
将特殊方法设置为 None 表示相应的操作不可用。 例如,如果一个类将 __iter__()
设置为 None,则该类是不可迭代的,因此在其实例上调用 iter() 将引发 TypeError(不会退回到 __getitem__()
)。但是,__hash__()
、__iter__()
、__reversed__()
和 __contains__()
方法对此有特殊处理; 其他仍然会引发 TypeError,但可以通过依赖 None 不可调用的行为来做到这一点。
在实现模拟任何内置类型的类时,重要的是仅在对被建模对象有意义的程度上实现模拟。 例如,某些序列可能适用于检索单个元素,但提取切片可能没有意义。 (其中一个例子是 W3C 文档对象模型中的 NodeList 接口。)
以下是一个简单的示例,展示了几个常见的特殊方法的用法:
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return f"{self.title} by {self.author}"
def __repr__(self):
return f"<{self.title} at {id(self)}>"
def __len__(self):
return self.pages
def __eq__(self, other):
return (
self.title == other.title and
self.author == other.author
)
# 使用 Book 类
book1 = Book("《Python之光》", "李老师", 500)
book2 = Book("《Python之光》", "李老师", 500)
book3 = Book("《深入浅出Pandas》", "李老师", 600)
print(book1) # 《Python之光》 by 李老师
print(len(book1)) # 500
print(book1 == book2) # True
print(book2 == book3) # False
repr(book3) # '<《深入浅出Pandas》 at 4409718064>'
以上是一个类实现了几个特殊方法的例子。在这个例子中:
__init__()
方法用于初始化对象。__str__()
方法定义了对象的字符串表示。__repr__()
交互式解释器调用显示的字符串。__len__()
方法定义了对象的长度,使得可以使用内置函数 len() 来获取书籍的页数。__eq__()
方法定义了对象的相等比较运算符 == 的行为,使得可以比较两本书是否相同。这些特殊方法可以大大增强类的灵活性和可用性,使得我们可以根据具体需求定制类的行为,使对象在使用时更符合我们的预期和习惯。
初始化和销毁:
__init__(self, ...)
: 初始化方法,在创建对象时调用。__del__(self)
: 析构方法,在对象被销毁前调用。字符串表示:
__str__(self)
: 返回对象的字符串表示,通常通过 str(obj) 或 print(obj) 调用。__repr__(self)
: 返回对象的“官方”字符串表示,通常通过交互式解释器调用。比较运算:
__eq__(self, other)
: 定义相等比较运算符 ==。__ne__(self, other)
: 定义不等比较运算符 !=。__lt__(self, other)
: 定义小于比较运算符 <。__gt__(self, other)
: 定义大于比较运算符 >。__le__(self, other)
: 定义小于等于比较运算符 <=。__ge__(self, other)
: 定义大于等于比较运算符 >=。数值运算:
__add__(self, other)
: 定义加法运算符 +。__sub__(self, other)
: 定义减法运算符 -。__mul__(self, other)
: 定义乘法运算符 *
。__truediv__(self, other)
: 定义真除法运算符 /。__floordiv__(self, other)
: 定义整除运算符 //
。__mod__(self, other)
: 定义取模运算符 %。__pow__(self, other[, modulo])
: 定义指数运算符 **
。容器操作:
__len__(self)
: 定义内置函数 len() 的行为。__getitem__(self, key)
: 定义索引访问操作符 []。__setitem__(self, key, value)
: 定义索引赋值操作符 []。__delitem__(self, key)
: 定义删除操作符 del obj[key]。属性访问:
__getattr__(self, name)
: 在访问不存在的属性时调用。__setattr__(self, name, value)
: 在设置属性时调用。__delattr__(self, name)
: 在删除属性时调用。更新时间:2024-12-03 07:10:58 标签:python 方法 特殊方法