使用随机初始化变量 (python) 创建 class 实例的副本

Creating copy of class instance with randomly init variable (python)

我需要用随机生成的数字初始化 class 的实例。然后我需要在几个不同的试验中使用这个实例。但是,我在制作这个实例的精确副本时遇到了麻烦——随机生成的数字不会保持不变。每个副本都生成一个新的随机数。

temp = proc(random.randint(min, max))
tempCpy = copy.copy(temp) #changes on temp interfere with tempCpy
tempCpy = copy.deepcopy(temp)  #doesn't start with same random number

你有一个 class 类似这样的东西,我假设:

class proc(object):

    def __init__(self, value):
        self.value = value

当你初始化你的第一个实例时,你写:

temp = proc(random.randint(min, max))

这会将随机数存储在 temp.value 中。

要制作副本,只需将 temp.value 传递给 proc 构造函数即可:

dupe = proc(temp.value)

你也可以编写你的 class 来自动执行此操作,这样当你将 proc 的实例传递给 proc 构造函数时,它会制作一个副本(与其他类型,例如 listdict,其构造函数可用于复制它们)。这样做的好处是,可以在 class 中保留制作副本 所需的所有知识,而不是调用者需要知道数据的存储位置。

class proc(object):
    def __init__(self, value):
        if isinstance(value, proc):
            value = value.value
        self.value = value

现在,您可以写:

dupe = proc(temp)

一个相关的方法是在 class.

上编写一个备用构造函数(通常命名为 from)作为 class 方法
class proc(object):

    def __init__(self, value):
        self.value = value

    @classmethod
    def from(cls, other):
        return cls(other.value)

然后复制:

dupe = proc.from(temp)

或者,您可以向 proc 添加一个方法来制作副本:

class proc(object):

    def __init__(self, value):
        self.value = value

    def copy(self):
        return type(self)(self.value)

现在您的副本是:

dupe = temp.copy()

最后,如果您将 copy 方法命名为 __copy__(或同时使用这两个名称),它将神奇地与 copy.copy 一起使用!

class proc(object):

    def __init__(self, value):
        self.value = value

    def copy(self):
        return type(self)(self.value)

    __copy__ = copy   # alias for use by 'copy' module

temp = proc(random.randint(min, max))
dupe = copy.copy(temp)

您需要使用您将重复使用的参数来初始化 random.seed()。它将保证您生成 "the same random number"。 (例如 random.seed(0) 在其余代码之前)

也许,你可以从你的对象中单独制作随机数?

init_numb = random.randint(min, max)
temp = proc(init_numb)
tempCpy = copy.copy(temp) #changes on temp interfere with tempCpy
tempCpy = copy.deepcopy(temp)