使用随机初始化变量 (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
构造函数时,它会制作一个副本(与其他类型,例如 list
和 dict
,其构造函数可用于复制它们)。这样做的好处是,可以在 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)
我需要用随机生成的数字初始化 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
构造函数时,它会制作一个副本(与其他类型,例如 list
和 dict
,其构造函数可用于复制它们)。这样做的好处是,可以在 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)