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

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

最佳答案

首先,不要将 _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

关于python - 在 Python 中创建对实例化类的新引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350071/

相关文章:

python - 正则表达式可选匹配运算符 : how to apply to a string of characters?

python - 在使用 conda 创建的不同环境中切换 jupyter 笔记本时遇到问题

javascript - flask : How to pass JSON to javascript file?

python - xpath - 选择父级,其中子级具有带有命名空间字典的特定属性值

python - 上下文管理器作为装饰器,可以访问生成的对象

python - 在不保存文件的情况下将excel数据上传到django

python - 如何在 pymongo 中使用 mongo 函数?

javascript - Lambda 演算——用 Mocking Bird 表达的函数看起来应该是递归的,但事实并非如此

javascript - D3实时绘图: slide from right&shift data as data length exceeds limit transition is not working

python - Elasticsearch DSL 中动态生成的 DocType