# python知识点介绍二 ## python知识点介绍二 Python里面的深拷贝和浅拷贝。一般来说,OOP中的浅拷贝只复制对象本身,深拷贝不仅复制对象,还会递归复制对象所关联的对象。对于对象object这种复杂数据结构,或者叫做积类型(product type),如果一个对象直接或者间接引用自身,深拷贝便会无限自我复制,陷入死循环。再一个,如果很多对象共享某一数据,那么深拷贝可能会对其进行拷贝,从而在读写时造成数据不一致性。 python在解决上述2个问题时,提供了copy模块中的copy和deepcopy函数实现浅拷贝和深拷贝。其中deepcopy通过memo字典在拷贝过程中,保存已经拷贝的对象,从而避免自引用递归的问题。另外通过copyreg模块的pickle函数定制类型对象的拷贝行为,避免对共享数据多次拷贝,带来读写混乱。 deepcopy函数的工作就是将Object一次序列化, python标准库对深拷贝和浅拷贝的支持和用法 python中列表和字典如何实现拷贝操作的 深拷贝的序列化和反序列化 设计模式中原型模式及应用 ## 装饰器方式 装饰器方式是隶属python中很有特色的语法,写法上很类似于java的annotation,但是两者本质是不同的。python装饰器相当于高阶函数,将函数本身当作操作数据对象,进行逻辑编程。java的annotation是元数据。 ```python from functools import wraps def singleton(cls): """单例类装饰器""" instances = {} @wraps(cls) def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class President: pass ``` ## 装饰器的注意事项 前述使用装饰器的单例模式,不是线程安全的。如果要求线程安全,需要使用threading的RLock对象加锁处理。使用锁对象的acquire和release方法来实现加锁和解锁的操作。当然,更为简便的做法是使用锁对象的with上下文语法来进行隐式的加锁和解锁操作 ## 使用元类的单例模式 在OOP中,对象通过类创建,类本身也是对象,类本身是通过元类来创建。在定义类时,如果没有指定父类,那么默认父类是object,如果没有给类指定元类,那么默认元类是type。通过自定义元类,我们可遗改变一个类的默认行为。 ## 单例模式应用场景 通常如果一个对象的状态要被其他对象共享访问,就可以将其设计为单例。例如项目中数据库连接池和配置对象。这样能保证其他处理对象访问的数据库连接和配置信息是一致的。而且由于对象实例只有首次创建,不用重复创建,避免了重复创建、销毁对象的时间和空间开销。一般来说,项目中日志对象是单例,因为日志对象总是要可写可读的,如果重复创建日志对象,可能造成日志数据源的混乱和污染。