CG机制
python的垃圾回收机制,简称GC
python中主要通过三种方式解决垃圾回收的方式:
1.引用计数:如果有新的引用指向对象,对象引用计数就加一,引用被销毁时,对象引用计数就减一,当用户的引用计数为0时,该内存被释放
2.标记清除:首先标记对象(垃圾检测),然后清除垃圾(垃圾回收)
初始所有对象标记为白色,并确定根节点对象(这些对象是不会被删除的),标记它们为黑色(表示对象有效)。
将有效对象引用的对象标记为灰色(表示对象可达,但它们所引用的对象还没有检查)
检查完灰色对象引用的对象后,将灰色标记为黑色.重复直到不存在灰色节点为止,最后白色节点都是需要清除的对象
3.分代回收:垃圾回收器会更频繁的处理新对象。一个新的对象即是你的程序刚刚创建的,而一个老的对象则是经过了几个时间周期之后仍然存在的对象。
python会在当一个对象从零代移动到一代,或是从一代移动到二代的过程中提升这个对象。
三元表达式,列表生成式,生成器表达式
1.三元表达式:是python为我们提供的一种简化代码的解决方案
res = 条件成立时返回的值 if 条件 else 条件不成立返回的值
2.列表生成式:相当于把for循环写进列表中,一行代码实现一个功能
res = [x for x in range(10)]
print(res) # [0,1,2,3,4,5,6,7,8,9]
3.生成器表达式:相当于把上述[]换成(),生成器表达式返回的是一个生成器对象,对比列表生成式更节省内存(一次只产生一个值在内存中)
递归函数
递归函数:在调用一个函数的内部又调用自己,所以递归的本质就是一个循环的过程,它的大前提就是递归带调用一定要在某一层结束,如果不结束,会形成死循环。
递归分为两个阶段:回溯,向下一层一层挖井
递推,向上一层一层返回
l1 = [[1,2],3,[4,[5,[6,7]]]]
def func(l1):
for x in l1:
if type(x) is list: # 满足未遍历完l1以及if判断成立的条件时 ,一直进行调用
func(x)
else:
print(x,end='') # 1234567
func(l1)
单例模式
1.属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例
# 基于classmethod 实现单例模式
class myClass(object):
instance = None
def __init__(self, ip, port):
self.ip = ip
self.port = port
@classmethod
def single(cls):
if not cls.instance:
cls.instance = myClass('127.0.0.1', 8000)
return cls.instance
obj1 = myClass.single()
obj2 = myClass.single()
print(obj1, obj2)
# 基于元类干预对象创建的过程
class MateClass(type):
# 记录对象是否被创建
instance = None
def __call__(self, *args, **kwargs):
if self.instance:
return self.instance
# 获取对象
obj = super().__call__(*args, **kwargs)
# 保存对象
self.instance = obj
# 返回对象
return obj
class single(metaclass=MateClass):
def __init__(self, name):
self.name = name
obj1 = single('summer')
obj2 = single('jer')
print(id(obj1))
print(id(obj2))
print(obj1.name)
print(obj2.name)
CBV源码简述
根据前端请求方式的不同自动匹配执行对应的方法
在url路由中的views.类名.as_view()的源码下可以看到是被@classonlymethod修饰的类方法,内部定义闭包函数传参并返回闭包函数名,在django启动的时候回执行urls的as_view()产生变形为views.view,在浏览器提交请求的时候就会触发view方法,通过view下的self使用类的对象,返回self.dispatch属性,在父类中的dispatch函数通过反射机制就是通过字符串操作对象属性,只有在被完成后才会真正执行,就是可以事先写好逻辑接口,事后实现接口功能
元类,魔法方法,猴子补丁
1.元类:创建类的类称为元类,函数type就是一个元类
2.魔法方法
__init__ 类加括号 实例化对象的时候会自动触发
__call__ 对象加括号的时候会自动触发,并且可以传参数
__str__ 执行打印操作的时候会触发 返回字符串
__new__ 创建对象时为对象分配空间,在实例化之前被调用
# 当我们在实例化对象的时候,new方法在init方法之前被调用,并将new方法的返回值传递给init方法作为第一个参数,最后init方法给对象设置一些参数
3.猴子补丁
猴子补丁主要的功能就是动态的属性替换,猴子补丁允许运行期间动态修改一个类或模块