在Python中创建对实例化类的新引用

时间:2016-10-31 20:27:04

标签: python

我有一个包含类引用的类属性

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并从中创建一个新实例,然后返回引用而不修改原始对象。我怎么能这样做?

3 个答案:

答案 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