本系列博客将不断总结python的应用技巧,本文主要内容源于《Fluent Python》一书。
1. python 中带有下划线的方法,其设计目的是避免自定义的变量以下划线开头。
以单下划线开头 _foo 的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入,相当于protected方法;
以双下划线开头的 __foo代表类的私有成员,仅有本类的内部变量可以访问;
以双下划线开头和结尾的 __foo__ 代表python里的系统方法,如 __init__() 代表类的构造函数。
2. python常用的built-in方法
和运算符无关的特殊方法:
字符串/字节序列表示形式: __repr__, __str__, __format__, __bytes__
数值转换: __abs__, __bool__, __complex__, __int__, __float__, __hash__, __index__
集合模拟: __len__, __getitem__, __setitem__, __delitem__, __contains__
迭代枚举:__iter__, __reversed__, __next__
可调用模拟:__call__
上下文管理: __enter__, __exit__
实例创建和销毁:__new__, __init__, __del__
属性管理 :__getattr__, __setattr__, __getattribute__, __setattribute__, __delattr__, __dir__
属性描述符: __get__, __set__, __delete__
跟类相关的服务: __prepare__, __instancecheck__, __subclasscheck__
和运算符相关的特殊方法:
一元运算符: __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__
2. python自带的collections包提供了一些加强版本的数据结构。
>>> collections.__all__
['deque', 'defaultdict', 'namedtuple', 'UserDict', 'UserList', 'UserString', 'Counter', 'OrderedDict', 'ChainMap', 'Awaitable', 'Coroutine', 'AsyncIterable', 'AsyncIterator', 'AsyncGenerator', 'Hashable', 'Iterable', 'Iterator', 'Generator', 'Reversible', 'Sized', 'Container', 'Callable', 'Collection', 'Set', 'MutableSet', 'Mapping', 'MutableMapping', 'MappingView', 'KeysView', 'ItemsView', 'ValuesView', 'Sequence', 'MutableSequence', 'ByteString']
namedtuple:创建一个只有少数属性,但没有方法的“类”
>>> Circle = collections.namedtuple('circle',['x','y','r'])