如何修复_replace方法

时间:2016-11-10 02:29:45

标签: python class

class type_name:
    def __init__(self, fields):
        self._fields = fields
        self._mutable = False 
        self.a = self._fields[0]
        self.b = self._fields[1]
        self.c = self._fields[2]

    def _replace(self, **kargs):
        if self._mutable:
            for key, value in kargs.items():
                if key == 'a':
                    self.a = value
                if key == 'b':
                    self.b = value
                if key == 'c':
                    self.c = value
            return None
        else:
            A = self.a, B = self.b, C = self.c
            return self.type_name(**kargs)

_replace方法将** kargs作为输入。 _replace方法取决于实例名称self._mutable中存储的值。 如果self.mutable == True,则调用它所调用的对象的实例名称,并且该方法返回None所以,如果origin = Point(0,0)并且我们调用origin._replace(y = 5),则打印(原点)将显示为Point(x = 0,y = 5),因为原点是突变的。

如果self.mutable == False,则返回同一类的新对象,其实例名称的值相同,但kargs中指定的值除外。因此,如果origin = Point(0,0)并且我们调用new_origin = origin._replace(y = 5),则print(origin,new_origin)将显示为Point(x = 0,y = 0)Point(x = 0) ,y = 5)因为原点没有变异

我不确定我的函数_replace有什么问题,有人可以帮我解决吗?感谢

1 个答案:

答案 0 :(得分:1)

__init__()没有关键字参数,只有list名为fields。您需要更改__init__()方法或将kwargs映射到list

class type_name:
    def __init__(self, fields):
        self._fields = fields
        self._mutable = False 
        self.a = self._fields[0]
        self.b = self._fields[1]
        self.c = self._fields[2]

    def _replace(self, **kwargs):
        if not self._mutable:
            return type_name([kwargs[c] for c in 'abc'])
        for key, value in kwargs.items():
            if key == 'a':
                self.a = value
            if key == 'b':
                self.b = value
            if key == 'c':
                self.c = value
        return None

a = type_name([1,2,3])
b = a._replace(a=3, b=2, c=1)
b.a
# 3

说实话,我不喜欢这种_replace()的过度使用。创建两种不同的方法。