代码之家  ›  专栏  ›  技术社区  ›  whiletrue

如何在Python中使用相同的参数在X的子方法中实例化类X?

  •  1
  • whiletrue  · 技术社区  · 8 年前

    我有以下示例代码:

    class X:
     def __init__(self, value):
      self.value = value
    
     def method_a(self):
      ...
    

    我现在想 实例化的新对象 十、 在内部 方法\u a ,重新使用 value ,即。

    def method_a(self):
     x = X(value = self.value)
    

    现在,想象一下我 几个 参数 在的构造函数中设置 X . 是否有一种“pythonic”方法可以一次重新设置/复制所有参数?比如:

    def method_a(self):
     x = X(self)
    

    后者不起作用(“\u init\uuuu()缺少1个必需的位置参数”)。我在文档中也找不到任何解决此问题的方法。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Stephen Rauch Afsar Ali    8 年前

    这个 copy 模块可能是您需要的:

    密码

    def method_a(self):
        return copy.copy(self)
    

    更精细的控制:

    在各种情况下,您可能只需要复制一些参数,可以使用 unpacking of argument lists 与…结合 getattr 要管理要复制的较长列表,请执行以下操作:

    def method_a(self):
        attributes_to_copy = ('value1', 'value2')
        kwargs = {k: getattr(self, k) for k in attributes_to_copy}
        return type(self)(**kwargs)
    

    测试代码:

    import copy
    
    class X(object):
        def __init__(self, value1, value2):
            self.value1 = value1
            self.value2 = value2
    
        def method_a(self):
            return copy.copy(self)
    
        def method_b(self):
            attributes_to_copy = ('value1', 'value2')
            kwargs = {k: getattr(self, k) for k in attributes_to_copy}
            return type(self)(**kwargs)
    
    x1 = X(1, 2)
    x2 = x1.method_a()
    x3 = x1.method_b()
    assert x1.value1 == x2.value1
    assert x1.value1 == x3.value1