二分
- 二分的前提是有序
- 时间复杂度为O(log n)
bisect模块
- bisect系,用于查找index
bisect.bisect_left
bisect.bisect_right
- insort系,用于实际插入
bisect.insort_left
- 默认重复时从右边插入
类的多继承
- 用途:在子类上实现对基类的增强、实现多态
- OCP原则:多用继承,少修改
Mixin类
- 将其他类混合,同时带来类的属性和方法
Mixin
类可以继承,本质是多继承实现的- 使用规则:
Mixin
类中不显式出现__init__
初始化方法- 混入其他类中实现部分功能,无法独立工作
Mixin
类的祖先类也是Mixin
类Mixin
类通常在继承列表中的第一个位置
魔术方法
- hash值相同只是hash值冲突,对象不一定相等,使用
set
并不一定去重 - 去重需要提供
__eq__
方法 list
类实例源码中有__hash__ = None
,则其不可hash
容器相关方法
__len__
- 返回对象的长度,若无
__bool__
方法则查看__len()__
方法是否存在,存在返回非0为真;空字典
、空元组
、空集合
、空列表
、空字符串
长度为0,等效False
- 返回对象的长度,若无
__iter__
- 迭代容器,返回一个新的迭代器对象
__contains__
- in成员运算符,未实现则调用
__iter__
方法遍历
- in成员运算符,未实现则调用
__getitem__
- 实现
self[key]
访问,key
为hashable
,不存在则KeyError
异常
- 实现
__setitem__
- 设置值的方法
__missing__
- 字典或其子类使用
__getitem()__
调用时,key不存在则执行此方法
- 字典或其子类使用
可调用对象
__call__
- 类中定义该方法,实例化得到其实例,则实例可像函数一样调用
# 定义fib数列的类
class Fib:
def __init__(self):
self.item = [0, 1, 1]
def __call__(self, index):
if index < 0:
raise IndexError('Wrong Index')
if index < len(self.item):
return self.item[index]
for i in range(3, index + 1):
self.item.append(self.item[i-1] + self.item[i-2])
return self.item[index]
print(Fib()(100))
上下文管理
# 将类作为装饰器,使用上下文管理方法显示函数执行时长
import time, datetime
from functools import wraps, update_wrapper
class TimeIt:
'''This is A Class'''
def __init__(self, fn):
self.fn = fn
# 把函数对象的文档字符串赋值给类
# self.__doc__ = fn.__doc__
# update_wrapper(self, fn)
wraps(fn)(self)
def __enter__(self):
self.start = datetime.datetime.now()
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.delta = (datetime.datetime.now() - self.start).total_seconds()
print('{} took {} second(s).context'.format(self.fn.__name__,self.delta))
def __call__(self, *args, **kwargs):
self.start = datetime.datetime.now()
ret = self.fn(*args, **kwargs)
self.delta = (datetime.datetime.now() - self.start).total_seconds()
print('{} took {} second(s).call'.format(self.fn.__name__,self.delta))
return ret
@TimeIt
def add(x, y):
'''This is add function'''
time.sleep(3)
return x + y
print(add(4, 5))
print(add.__doc__)
print(TimeIt(add).__doc__)
反射
- 定义:通过一个对象,找出其type,class,attribute,method的能力
- 反射能力的函数:
type()
,isinstance()
,callable()
,dir()
,getattr()
描述器
- 属性查找顺序
- 实例的
__dict__
优先于非数据描述器 - 数据描述器优先于实例的
__dict__
- 实例的
# 类staticmethod装饰器
class StaticMethod:
def __init__(self,fn):
self.fn=fn
def __get__(self, instance, owner):
return self.fn
class A:
@staticmethod
def cmd():
print('static method')
A.cmd()
A().cmd()
# 类classmethod装饰器
class ClassMethod:
def __init__(self, fn):
self.fn = fn
def __get__(self, instance, owner):
ret = self.fn(owner)
return ret
class A:
@ClassMethod
def clscmd(cls):
print(cls.__name__)
print(A.__dict__)
A.clscmd