第三章魔法函数
1.什么是魔法函数
- 魔法函数是以上下划线开头和双下划线结尾的函数:__init__(self){...}
- 魔法函数是python帮我们定义过的不需要自己定义
- python可以帮我们自动(隐式)调用魔法函数,不需要自己调用:例如调用__getitem__(self,item)就具有了迭代器属性可以放入for in 循环中遍历
1 class Company(object): 2 def __init__(self, employee_list): 3 self.employee = employee_list 4 5 # python编译器自动调用,使得可以在for in循环中使用 6 def __getitem__(self, item): 7 return self.employee[item] 8 9 10 company = Company(["tom", "bob", "jane"]) 11 for em in company: 12 print(em) # tom bob jane
2.python的数据模型以及数据模型对python的影响
- 此处的数据模型也就是常说的魔法函数
- 如果自己没有实现类中的一些数据模型可能会对python中的遍历,切片等语法产生影响
1 class Company(object): 2 def __init__(self, employee_list): 3 self.employee = employee_list 4 5 # python编译器自动调用,使得可以在for in循环中使用 6 def __getitem__(self, item): 7 return self.employee[item] 8 9 # python编译器自动调用,获得长度 10 # def __len__(self): 11 # return len(self.employee) 12 13 14 company = Company(["tom", "bob", "jane"]) 15 for em in company: 16 print(em) # tom bob jane 17 18 # __getitem__处理切片的数据可以得到len,不可以处理没有切片的数据 19 company1 = company[:2] 20 21 # 步骤: 22 # 1.查找否有__len__ 23 # 2.没有__len__再查看数据是否切片并且是否有__getitem__ 24 # 3.有则可以获得len,如果数据没有切片则会报错 25 print(len(company1)) # 2
3.魔法函数一览表
- 非数学运算
- 字符串:
- __repr__
- __str__
- 集合、序列相关
- __len__
- __getitem__
- __setitem__
- __delitem__
- __contains__
- 迭代相关
- __iter__
- __next__
- 可调用
- __call__
- with上下文管理器
- __enter__
- __exit__
- 数值转换
- __abs__
- __bool__
- __int__
- __float__
- __hash__
- __index__
- 元类相关
- __new__
- __init__
- 属性相关
- __getattr__、__setattr__
- __getattribute__、setattribute__
- __dir__
- 属性描述符
- __get__
- __set__
- __delete__
- 协程
- __await__
- __aiter__
- __anext__
- __aenter__
- __aexit__
- 字符串:
- 数学运算
- 一元运算符
- __neg__(-)、__pos__(+)、__abs__
- 二元运算符
- __lt__(<)、__le__(<=)、__eq__(==)、__ne__(!=)、__gt__(>)、__ge__(>=)
- __add__(+)、__sub__(-)、__mul__(*)、__truediv__(/)、__floordiv__(//)、
- 算术运算符
- 反向算术运算符
- 增量赋值算数运算符
- 位运算符
- 反向位运算符
- 增量赋值位运算符
- 一元运算符
编写__str__、__repr__方法
1 class Company(object): 2 def __init__(self, employee_list): 3 self.employee = employee_list 4 5 # 在对象格式化时调用 6 def __str__(self): 7 return ",".join(self.employee) 8 9 # 在开发模式下调用 10 def __repr__(self): 11 return ",".join(self.employee) 12 13 14 company = Company(["tom", "bob", "jane"]) 15 # 对象格式化 16 print(company) # tom,bob,jane 17 # 开发模式:cmd或notebook中调用 18 company # tom,bob,jane
编写__add__方法
1 class MyVector(object): 2 def __init__(self, x, y): 3 self.x = x 4 self.y = y 5 6 def __add__(self, other): 7 re_vector = MyVector(self.x + other.x, self.y + other.y) 8 return re_vector 9 10 def __str__(self): 11 return "x:{x},y:{y}".format(x=self.x, y=self.y) 12 13 14 vec1 = MyVector(1, 2) 15 vec2 = MyVector(3, 4) 16 print(vec1 + vec2) # x:4,y:6