魔法函数
魔法函数是Python内置由双下划线开头和双下划线结尾的函数,如__getitem__, __iter__, __len__等
1 2 3 4 5 6 7 8 9 10 11 12 |
# 对类的遍历 class Company(object): def __init__(self, employee_list): self.employee = employee_list def __getitem__(self, item): return self.employee[item] company = Company(['tom', 'bob', 'jane']) for em in company: print(em) |
非数学运算
字符串表示
__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__ // 、 __
mod__ % 、 __divmod__ divmod() 、 __pow__ ** 或 pow() 、 __round__ round()
反向算术运算符
__radd__ 、 __rsub__ 、 __rmul__ 、 __rtruediv__ 、 __rfloordiv__ 、 __rmod__ 、
__rdivmod__ 、 __rpow__
增量赋值算术运算符
__iadd__ 、 __isub__ 、 __imul__ 、 __itruediv__ 、 __ifloordiv__ 、 __imod__ 、
__ipow__
位运算符
__invert__ ~ 、 __lshift__ << 、 __rshift__ >> 、 __and__ & 、 __or__ | 、 __
xor__ ^
反向位运算符
__rlshift__ 、 __rrshift__ 、 __rand__ 、 __rxor__ 、 __ror__
增量赋值位运算符
__ilshift__ 、 __irshift__ 、 __iand__ 、 __ixor__ 、 __ior__
类和实例属性的查找顺序
Python 2.2之前采取DFS深度优先,2.2引入BFS广度优先,2.3之后至今引入C3算法,查找顺序可通过A.__mro__来进行查看(MRO:Method Resolution Order)
super()函数的调用也是遵循MRO的调用顺序的
静态方法和类方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
class Date: def __init__(self, year, month, day): self.year = year self.month = month self.day = day @staticmethod def parse_from_string(date_str): year, month, day = tuple(date_str.split("-")) # 静态方法需要通过硬编码的方法输入类名,类名一旦修改就需要修改代码,对于无需写入类名的方法一般建议用静态方法 return Date(int(year), int(month), int(day)) @classmethod def from_string(cls, date_str): year, month, day = tuple(date_str.split("-")) # 类方法无需写入类名,方法定义中的cls只是惯例,可以进行修改 return cls(int(year), int(month), int(day)) def __str__(self): return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day) if __name__=='__main__': # 使用实例方法处理日期 new_day = Date(2018, 5, 1) print(new_day) date_str = "2018-05-01" # 使用静态方法处理日期 new_day = Date.parse_from_string(date_str) print(new_day) # 使用类方法处理日期 new_day = Date.from_string(date_str) print(new_day) |
私有属性:Python中没有private关键字,私有属性通过在变量名或方法名前加双下划__var_name, __method_name来实现
注:实际上把在实例调取时用_ClassName__var_name还是可以访问到该变量的
列出对象的属性:my_object.__dict__, dir(my_object),后者内容更加丰富,但不包含值
try…except…else..finally…语句中不论是否抛出了异常finally中的语句都会被执行(这有利于解决文件或数据库连接关闭的释放资源问题),并且当finally中有return语句时其它代码块中的return内容将不会被返回,因为在执行中return的内容会先被压入栈中,后进先出
上下文管理器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# 使用魔法函数 class Sample: def __enter__(self): print("entering") return self def __exit__(self, exc_type, exc_val, exc_tb): print("exiting") def do_something(self): print("doing something") with Sample() as sample: sample.do_something() # 使用contextlib import contextlib @contextlib.contextmanager def file_open(file_name): # __enter__中的内容 print("file open") yield {} # __exit__中的内容 print("file end") with file_open("test.txt") as f_opened: print("file processing") |
对象切片:[start:end:step]