python中的元类 – type type创造了python中一切 充分体现了动态语言的特性 1.type 可以求一个类型 或者一个对象的 类型名称 2.type 创建一个类型 type(类型名,base_class_tuple,attr_dict)
python 创建class 默认是用type class X(metaclass= xx): #按照xx去实例化X类对象 pass
class X(): metaclass = xx
Django 模型类 ORM全称“Object Relational Mapping”,即对象-关系映射
day1 = Weekday.Mon print(day1) Weekday.Mon
print(Weekday.Tue) Weekday.Tue
print(Weekday[‘Tue’]) Weekday.Tue
print(Weekday.Tue.value) 2
print(day1 == Weekday.Mon) True
print(day1 == Weekday.Tue)
‘new’, 创建并且返回一个对象 构造 在python中把 new 和 init 统称为构造方法 __new__负责创建一个对象 一定要有返回值 即返回创建的对象 __init__负责绑定成员属性 初始化
class X: def new(cls,*args,**kwargs): return super().new(cls)
对象实例化的过程: new init
object: ‘class’, ‘delattr’, ‘dict’, ‘dir’, ‘doc’, ‘eq’, ‘format’, ‘ge’, ‘getattribute’, ‘gt’, ‘hash’, ‘init’, ‘init_subclass’, ‘le’, ‘lt’, ‘module’, ‘ne’, ‘reduce’, ‘reduce_ex’, ‘repr’, ‘setattr’, ‘sizeof’, ‘str’, ‘subclasshook’, ‘weakref’
编程模式 总结固定的编程方式(常见的23种) 与编程语言无关 是一种思想: 创建型模式,共五种: 工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式,共七种: 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种: 策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、 备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
程序运行过程中可能出现的问题称之为异常 python解释器对于程序的异常处理为 : 显示错误信息 中断程序运行 python的异常处理: 对于有可能产生异常的代码进行异常捕获 try: 有可能产生异常的代码 except: 异常处理
try: except 异常类型: 处理指定的异常类型 try: except 异常类型1: pass except 异常类型2: pass ... try: except (异常类型1,异常类型2,...): pass异常捕获是根据异常的类型来进行捕获 产生异常抛出了一个异常对象 isinstance(异常对象,异常类型) 异常子类型要在父类型之后进行捕获处理 如果异常子类型在后 该分支永远无法执行到
如果要获取异常对象 需要在 异常类型后面 as err: 如果要确保捕获所有异常: 最后一个捕获分支 except: except BaseException: 如果需要处理没有发生异常的情况: 可以加上一个 else: 如果无论是否发生异常都要执行的代码 finally
自定义异常类型 继承 BaseException Exception 抛出异常 raise 异常对象 except分支抛出捕获的异常: raise异常捕获处理之后,程序能够从该处理异常后面的继承往下执行
with上下文件管理 with open() as f:
对象[start:stop:step] 切片 start 默认是0 stop默认是末尾+1 step默认是1 slice(start,stop,step) [start:stop:step] 对象[] 进行访问 本质上是调用的 getitem 方法 如果自定义类型对象要支持切片: def getitem(self,s): if isinstance(s,int): if isinstance(s,slice):
列表生成式 推导式 把循环的每一项结果作为列表的一项 [expr for x in iterable [if conidition]] if conidition 不能有else语句 但是如果要做到相同的功能可以把if提前 [expr if condition else expr1 for…]
列表推导式 [] 结果的类型是list
如果把列表推导式稍微修改一下 把[] --> () 结果类型不是元祖 而是一个生成器
python3中range(start,stop,step)返回的结果就是一个generator 生成器 不会直接把所有的数据一次性生成好 一次一次生成 直接全部生成 浪费内存
取生成器中的数据: next(生成器) 每调用一次获取一个结果 当生成器中所有数据取完之后 StopIteration for x in 生成器: list(生成器) g.send(val) #也能够获取一个数据 并且能够把val发送给 yield语句 如果使用next() yield返回结果就为None在函数中用yield使函数的返回结果变成了个生成器 如果一个类中实现了__next__方法 那么该类的对象调用__next__ or next(obj) 得到一个生成器
from collections import Iterable,Iterator Iterator Iterable
list,tuple,str,set,dict都是Iterable 可迭代的 只要能用在for i in x: 那x就是可迭代的对象 isinstance((),Iterable) True isinstance([],Iterable) True isinstance({},Iterable) True isinstance('',Iterable) True所有的Iterable对象都可以用iter(obj) 变成Iterator 迭代器 凡是可以用next()函数来获取下一项的对象 都是 Iterator 生成器就是Iterator 实现了__iter__的类的对象就是Iterator iter 实现需要注意: 一定要返回一个Iterator 如果一个对象是Iterator 那么 它也一定是Iterable (所有的迭代器一定是可迭代的)
在一个函数内部再定义一个函数 里面的函数用到了外面函数的变量 把里面函数和外面函数的变量统称为闭包 闭包中的局部变量得不到释放 在闭包中访修改层函数的变量 需要用 nonlocal 来进行声明
装饰器在不改变函数原有结构的前提下 能够进行逻辑操作 装饰器可以是闭包 也可以是类 如果把类当作一个装饰器,需要实现 init 和 class
