Python面向对象进阶

二分

  • 二分的前提是有序
  • 时间复杂度为O(log n)

bisect模块

  • bisect系,用于查找index
    • bisect.bisect_left
    • bisect.bisect_right
  • insort系,用于实际插入
    • bisect.insort_left
  • 默认重复时从右边插入

Python面向对象进阶_第1张图片

Python面向对象进阶_第2张图片

Python面向对象进阶_第3张图片

类的多继承

  • 用途:在子类上实现对基类的增强、实现多态
  • OCP原则:多用继承,少修改

Python面向对象进阶_第4张图片

Mixin类

  • 将其他类混合,同时带来类的属性和方法
  • Mixin类可以继承,本质是多继承实现的
  • 使用规则:
    • Mixin类中不显式出现__init__初始化方法
    • 混入其他类中实现部分功能,无法独立工作
    • Mixin类的祖先类也是Mixin
    • Mixin类通常在继承列表中的第一个位置

Python面向对象进阶_第5张图片

Python面向对象进阶_第6张图片

魔术方法

Python面向对象进阶_第7张图片

Python面向对象进阶_第8张图片

  • hash值相同只是hash值冲突,对象不一定相等,使用set并不一定去重
  • 去重需要提供__eq__方法
  • list类实例源码中有__hash__ = None,则其不可hash

容器相关方法

  • __len__
    • 返回对象的长度,若无__bool__方法则查看__len()__方法是否存在,存在返回非0为真;空字典空元组空集合空列表空字符串长度为0,等效False
  • __iter__
    • 迭代容器,返回一个新的迭代器对象
  • __contains__
    • in成员运算符,未实现则调用__iter__方法遍历
  • __getitem__
    • 实现self[key]访问,keyhashable,不存在则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()

Python面向对象进阶_第9张图片

在这里插入图片描述

在这里插入图片描述

描述器

Python面向对象进阶_第10张图片

Python面向对象进阶_第11张图片

  • 属性查找顺序
    • 实例的__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面向对象进阶)