9.18整理

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.猴子补丁
  猴子补丁主要的功能就是动态的属性替换,猴子补丁允许运行期间动态修改一个类或模块
posted @ 2022-09-18 15:46  Hsummer  阅读(20)  评论(0编辑  收藏  举报