python 杂记

date
May 18, 2021
slug
37
status
Published
tags
Python
summary
type
Post

字符流字节流

字符流 unicode
字节流 utf-8
IO

dict/set

哈希存储, O(1), 缺点是吃内存
如果有for循环遍历多层, 建议用dict缓存, 用空间换时间.

迭代器/生成器

装饰器

面向对象编程

属性搜索优先级

当获取元素的时候,实际上调用的是object.__getattribute__(key) —> 所谓的搜索优先级实际上是object.__getattribute__(key)实现的
属性搜索优先级 数据描述符 > __dict__ > 非数据描述符 > __getattr__
方法实际上是一个非数据描述符。

描述符 descripter

__get__
__set__

property

  1. LazyProperty

mixin 和 super

__mro__
C3 线性算法
Z K1 C K3 A K2 B D E O
notion image

元类 metaclass

class Type(type):
    def __init__(cls, *args, **kwargs):
        print cls, args, kwargs

    def __new__(meta, cls_str, cls, args_dict):
        print cls_str, cls, args_dict
        return super(Type,meta).__new__(meta, cls_str, cls, args_dict)

    def __call__(cls, *args, **kwargs):
        print 'new'
        self = cls.__new__(cls, *args, **kwargs)
        if isinstance(self, cls):
            print 'init'
            self.__init__(*args, **kwargs)
        print 'return'
        return self


class Object(object):
    __metaclass__ = Type

    def __new__(cls, *args, **kwargs):
        print "__new__", args, kwargs
        return object.__new__(cls, *args, **kwargs)

    def __init__(self, *a, **kw):
        print "__init__", a, kw

Object(1, 2, 3)
如果父类有元类, 子类的元类必须是父类元类的子类.

typehint 类型推到 类型提示

def greeting(name: str) -> str:
return 'Hello ' + name
: str
-> str

async await —> 关键字

asyncio —> 模块
websocket —> daphne —> twisted —> aio

python字典key默认带顺序了

Dictionary order is guaranteed to be insertion order. This behavior was an implementation detail of CPython from 3.6.

from __future__ import annotations

注解在运行时将不会被解析

Pysnooper Cyberbrain

依赖code frame 生成类似调试的信息.

装饰器和元类哪个先执行 —> 装饰器先执行

def deco(function):
    print 'i am in deco'
    return function

class MetaClass(type):
    def __init__(cls,name,bases,attr):
        print 'i am in MetaClass'

class Home(object):
    __metaclass__ = MetaClass

    @deco
    def index(self):
        print 'i am in index'

Home()
# i am in deco
# i am in MetaClass

弱引用 weakref

对对象的弱引用不能保证对象存活:当对像的引用只剩弱引用时, [garbage collection](https://docs.python.org/zh-cn/3/glossary.html#term-garbage-collection) 可以销毁引用并将其内存重用于其他内容。但是,在实际销毁对象之前,即使没有强引用,弱引用也一直能返回该对象。
弱引用的主要用途是实现保存大对象的高速缓存或映射,但又并希望大对象仅仅因为它出现在高速缓存或映射中而保持存活。
例如,如果您有许多大型二进制图像对象,则可能希望将名称与每个对象关联起来。如果您使用Python字典将名称映射到图像,或将图像映射到名称,则图像对象将保持活动状态,因为它们在字典中显示为值或键。 [`weakref`](https://docs.python.org/zh-cn/3/library/weakref.html#module-weakref) 模块提供的 [`WeakKeyDictionary`](https://docs.python.org/zh-cn/3/library/weakref.html#weakref.WeakKeyDictionary) 和 [`WeakValueDictionary`](https://docs.python.org/zh-cn/3/library/weakref.html#weakref.WeakValueDictionary) 类可以替代Python字典,使用弱引用来构造映射,这些映射不会仅仅因为它们出现在映射对象中而使对象保持存活。例如,如果一个图像对象是 [`WeakValueDictionary`](https://docs.python.org/zh-cn/3/library/weakref.html#weakref.WeakValueDictionary) 中的值,那么当对该图像对象的剩余引用是弱映射对象所持有的弱引用时,垃圾回收可以回收该对象并将其在弱映射对象中相应的条目删除。
 

© chaleaoch 2021