# 第三章:魔法函数
# 3.1 什么是魔法函数
python 定义类时,以双下划线开头,以双下划线结尾函数称为魔法函数
- 魔法函数可以定义类的特性
- 魔法函数是解释器提供的功能
- 魔法函数只能使用 python 提供的魔法函数,不能自定义
class Company:
def __init__(self, employee_list):
self.employee = employee_list
def __getitem__(self, index):
return self.employee[index]
company = Company(['alex', 'linda', 'catherine'])
employee = company.employee
for item in employee:
print(item)
# for 首先去找 __iter__, 没有时优化去找__getitem__
for item in company:
print(item)
# 3.2 python 数据模型
# python 数据模型
数据模型,涉及到知识点其实就是魔法函数
- 魔法函数会影响 python 语法 company[:2]
- 魔法函数会影响内置函数调用 len(company)
# 3.3 魔法函数一览
# 非数据运算
字符串表示
- repr
- str
class Company:
def __init__(self, name):
self.name = name
def __str__(self):
return '<Company [%s]>' % self.name
def __repr__(self):
return '<Company [%s]>' % self.name
company = Company('Apple')
print(company)
# Python 解释器会隐含调用
print(company.__repr__())
集合、序列相关
- len
- getitem
- setitem
- delitem
- contains
迭代相关
- iter
- next
可调用
- call
with 上下文管理器
- enter
- exit
# 数据运算
- abs
- add
class Num:
def __init__(self, num):
self.num = num
def __abs__(self):
return abs(self.num)
n = Num(-1)
print(abs(n))
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)
def __str__(self):
return 'Vector(%s, %s)' % (self.x, self.y)
v1 = Vector(1, 3)
v2 = Vector(2, 4)
print(v1 + v2)
# 3.4 len 函数的特殊性
CPython时,向list,dict等内部做过优化,len(list)效率高
# 3.5 本章小结
- 什么是魔法函数,如何增加类型的特性
- 不需要显示调用魔法函数,内置函数或相应python语法时会自动触发魔法函数
- 通过魔法函数去理解 python 类型
- len 内部有优化