如何"deepcopy"Python对象跳过一个或多个属性?

How to "deepcopy" Python object skipping one or more attributes?

我正在尝试创建一个简单的 deepcopy 函数,它只是跳过一些对象属性,但我下面的原型实现进入了无限递归。这是正确的方法吗?

from copy import deepcopy

class Foo():

    def __init__(self):
        self.copied = 1
        self.skipped = 2

    def __deepcopy__(self, memo):
        obj = type(self)()
        for attr in dir(self):
            if attr in ['skipped']:
                continue
            attr_copy = deepcopy(getattr(self, attr), memo)
            setattr(obj, attr, attr_copy)
            pass
        return obj

o1 = Foo()
o2 = deepcopy(o1)

(我知道在这个简单的情况下我可以在新实例上使用 delattr,但对于更复杂的情况我想使用深度复制功能。)

不确定这是否是最佳或正确的方法,但我最终想出了以下方法:

def __deepcopy__(self, memo):
    cls = self.__class__
    obj = cls.__new__(cls)
    memo[id(self)] = obj
    for k, v in self.__dict__.items():
        if k == ['skipped']:
            v = dict()
        setattr(obj, k, deepcopy(v, memo))
        pass
    return obj