二分
- 二分的前提是有序
- 时间复杂度为O(log n)
bisect模块
- bisect系,用于查找index
bisect.bisect_leftbisect.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
本文深入探讨了二分法的基本原理及其在有序数组中的应用,解析了Python bisect模块的功能,包括bisect_left、bisect_right、insort_left等方法。此外,还讲解了类的多继承、Mixin类的使用规则、魔术方法如__call__、__getitem__等,以及上下文管理、反射、描述器等高级主题。
736

被折叠的 条评论
为什么被折叠?



