更新属性并返回相同类的新副本

时间:2019-01-19 17:00:47

标签: python

class Main(object):

    def __init__(self,  config):
        selt.attributes = config

    def return_new_copy(self, additional_attributes):
        addtional_attributes.update(self.attributes)
        return Main(additional_attributes) 

我想更新实例属性并返回相同类的新实例。我想我试图找出上面的代码是Pythonic还是一种肮脏的方法。由于此处未提及的几种原因,我无法使用classmethod。是否有另一种推荐的方法。

1 个答案:

答案 0 :(得分:0)

您的return_new_copy修改了传入的参数,这可能是不希望的。它还会沿错误的方向覆盖(优先级为self.attributes

我将其编写如下:

def return_new_copy(self, additional_attributes):
     # python<3.5 if there are only string keys:
     #     attributes = dict(self.attributes, **additional_attributes)
     # python<3.5 if there are non-string keys:
     #     attributes = self.attributes.copy()
     #     attributes.update(additional_attributes)
     # python3.5+
     attributes = {**self.attributes, **additional_attributes}
     return type(self)(attributes)

一些细微之处: -我确保同时复制输入属性和自我属性 -我在自我属性之上合并了其他属性

如果您正在寻找可以自动执行此操作的内容,则可能要签出namedtuple

例如:

>>> C = collections.namedtuple('C', ('a', 'b'))
>>> x = C(1, 2)
>>> x
C(a=1, b=2)
>>> y = x._replace(b=3)
>>> y
C(a=1, b=3)
>>> x
C(a=1, b=2)