gpt4 book ai didi

python - 将自定义(深度)复制逻辑添加到 python 类的正确方法

转载 作者:太空狗 更新时间:2023-10-29 18:12:41 25 4
gpt4 key购买 nike

我正在实现一个提供一些嵌套数据结构的 python 类。我想添加对通过 copy.copy() 进行复制和通过 copy.deepcopy() 进行深度复制的支持,作为 docs for the copy module描述,涉及编写 __copy__()__deepcopy__ 特殊方法。

我知道如何教我的类(class)复制自己,但我想避免在新实例上通过 __init__(),因为 __init__()做一些我的复制逻辑不想(或不需要)做的事情。

我最终得到的是这种方法,它按预期工作:

def __copy__(self):
cls = type(self)
obj = cls.__new__(cls)
# custom copying logic that populates obj goes here
return obj

我的问题是:对于想要跳过 __init__() __copy__() 实现,调用 cls.__new__(cls) 是正确的方法吗 复制?还是我忽略了一种更“pythonic”的方法?

最佳答案

我不知道这是否更像 pythonic,但你可以使用一个标志。

from collections import Mapping
from copy import copy, deepcopy


class CustomDict(dict, Mapping):
_run_setup = True

def __init__(self, *args, **kwargs):
self._dict = dict(*args, **kwargs)
if args and isinstance(args[0], CustomDict):
self._run_setup = args[0]._run_setup
if self._run_setup:
print("Doing some setup stuff")
else:
try:
print("Avoiding some setup stuff")
finally:
self._run_setup = True

def __getitem__(self, key):
return self._dict[key]

def __iter__(self):
return iter(self._dict)

def __len__(self):
return len(self._dict)

def __copy__(self):
self._run_setup = False
try:
copied_custom_dict = CustomDict(self)
finally:
self._run_setup = True
return copied_custom_dict

在上面的 __init__ 中,只有在 _run_setup = True 时才会执行条件设置。避免这种情况的唯一方法是调用 CustomDict,第一个参数是 _run_setup = False 的实例。这样,很容易以不同的方式翻转设置开关。

try...finally block 对我来说看起来很笨重,但它是一种确保每个方法都以 _run_setup = True 开始和结束的方法。

关于python - 将自定义(深度)复制逻辑添加到 python 类的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44231316/

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