python - 如何深度复制实例属性?

标签 python

如何深度复制session属性?

import copy

from requests_toolbelt.sessions import BaseUrlSession


class MyClass:
    def __init__(self, url):
        self.session = BaseUrlSession(base_url=url)


o = MyClass(url='https://httpbin.org')
print(o.session.base_url)  # outputs: https://httpbin.org

copied = copy.deepcopy(o)
print(copied.session.base_url)  # outputs: None

附言我知道这与 __deepcopy__ 方法有关。

最佳答案

要直接回答您的问题 - 因为您的构造函数中没有参数,其他一切都是确定性的 - 您只需将以下函数添加到您的类中:

def __deepcopy__(self, memo):
    return MyClass()

对于更详细的情况(您在构造函数上有参数):

def __deepcopy__(self, memo):
    new_ = MyClass(None)
    for el in dir(self):
        if(el[:2]+el[-2:] != "____"):
            setattr(new_, el, getattr(self, el)) 
    return new_

注意 - 您可以尝试递归地深拷贝类中的每个参数,然后是该参数的每个参数(以合理的方式定义它是非常重要的,因为您应该只复制未在深拷贝中重新初始化的参数之前)等

这会起作用,假设所有的参数都按照您的意愿实现了 deepcopy。在你的情况下 - BaseUrlSession 已经会失败这种方法:

a = BaseUrlSession(base_url="http://www.google.pl")
b = copy.deepcopy(a)

print(a.base_url, b.base_url)
# prints: 
# http://www.google.pl None

现在更推荐的方法是显式存储所有变量,这将使您能够重新初始化您的类以获得正确的深度复制,如此简单:

class MyClass:
    def __init__(self, url):
        self.url = url
        self.session = BaseUrlSession(base_url=url)

    def __deepcopy__(self, memo):
        return MyClass(url=self.url)

关于python - 如何深度复制实例属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64957010/

相关文章:

python - 如何使用 python 帮助来归档函数

python - 检查图像的 URL 是否已启动并存在于 Python 中

python - Pandas 分组、过滤和绘图

python - 是否可以从 psycopg2 或 sqlalchemy 为 PostgreSQL 发出 "VACUUM ANALYZE <tablename>"?

python - 导入 geopandas 时出错

python - 应用程序的自定义 django 管理模板

python - 如何将 Django REST 框架与具有外键默认值的模型一起使用?

继承类中的python __init__方法

java - 在 tensorflow 中沿轴选择随机数量的点

python - 如何获取wget下载的文件的文件名