gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:12:28 25 4
gpt4 key购买 nike

如何深度复制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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com