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”,即对象-关系映射
枚举类:
from enum import Enum
WEEK = Enum('WEEK',('MON','TUS','WED','THI','FRI'))
for name,member in WEEK.__members__.items():
print(name,member)
from enum import Enum, unique
@unique
class Weekday(Enum):
Sun = 0 # Sun的value被设定为0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
day1 = Weekday.Mon
print(day1)
Weekday.Monprint(Weekday.Tue)
Weekday.Tueprint(Weekday[‘Tue’])
Weekday.Tueprint(Weekday.Tue.value)
2print(day1 == Weekday.Mon)
Trueprint(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