我有一个包含类引用的类属性
class UserEnvironment(object):
_user = None
def __init__(self, session_id):
self._user = User(session_id)
def create_user(self):
# copy self._user modify the copy and return it without modifying original object.
我需要做的是使用self._user并从中创建一个新实例,然后返回引用而不修改原始对象。我怎么能这样做?
答案 0 :(得分:1)
首先,不要将_user
定义为类成员。删除语句或_user
对所有类实例都是相同的。可能不是你想要的。
然后,要“克隆”用户,只需像这样使用copy.deepcopy
;
导入副本
class UserEnvironment(object):
def __init__(self, session_id):
self._user = User(session_id)
def create_user(self):
# copy self._user modify the copy and return it without modifying original object.
return copy.deepcopy(self._user)
请注意copy.deepcopy
克隆所有成员递归,如果您的类引用自身或从不更改的大数据集,则可能会出现问题。
根据具体情况,您可以使用copy.copy
,或者只创建自己的自定义clone
方法,例如:
class User(object):
def __init__(self, session_id):
self.__session_id = session_id
self.__random = random.random()
def clone(self):
u = User(self.__session_id)
# overwrite the random field by ours
u.__random = self.__random
return u
答案 1 :(得分:1)
使用copy模块:
import copy
def create_user(self):
user_copy = copy.deepcopy(self._user)
# do something with it. or simply change assignment with `return`
return user_copy
答案 2 :(得分:0)
这样的事情:
class UserEnvironment(object):
_user = None
def __init__(self, session_id):
self.session_id = session_id
self._user = self.create_user()
def create_user(self):
return User(self.session_id)
只需保留对session_id
的引用,并在需要时使用它创建新的User
。