【问题标题】:How to copy a module如何复制模块
【发布时间】:2014-02-08 01:44:47
【问题描述】:

假设我有两个模块a.pyb.pyb应该是a的副本。 假设这是a的内容:

#a.py
class Original(object):
    name = 'original'

复制a 的最明显方式是这样的:

#b.py
from a import *

但这并没有真正复制a,例如

>>>import a, b
>>>#this changes a.Original.name as well
>>>b.Original.name = 'FOOBAR'
>>>a.Original.name == 'FOOBAR'
True

所以我的问题是如何制作真正的副本?

【问题讨论】:

  • 模块只加载一次,类变量每个类只创建一次。
  • 你为什么要这样做?
  • 您似乎正在尝试使用通常使用类的模块。类支持多个实例,但模块不支持。

标签: python module package


【解决方案1】:

我认为您必须使用来自a.pyglobals()deepcopy 更新b.pyglobals() 字典。由于我们无法使用deepcopy 复制类对象,因此,您将使用type()a.py 中存在的所有类创建一个新类。

from copy import deepcopy
import types
import a

def class_c(c):
    #To create a copy of class object
    return type(c.__name__, c.__bases__, dict(c.__dict__))

filtered_a_dict = {k:v for k, v in a.__dict__.items()
                                   if not (k.startswith('__') and k.endswith('__'))}

globals().update({k:deepcopy(v) if not isinstance(v, types.TypeType) 
                               else class_c(v) for k, v in filtered_a_dict.items()})

del a

演示:

>>> import a, b
>>> b.Original.name = 'bar'
>>> a.Original.name == 'bar'
False

请注意,我们不会将模块用于此类目的,类是处理此类事情的正确工具。

【讨论】:

    【解决方案2】:

    你可以这样做:

    给定a.py 为:

    var = 123
    

    你可以这样做:

    >>> import a
    >>> b = a
    >>> b.var = 1234
    >>> a.var
    1234
    

    但是,您不能将 b 实现为自己的模块。

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 2021-09-21
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2015-11-12
      相关资源
      最近更新 更多