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有什么问题,有人可以帮我解决吗?感谢
答案 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()
的过度使用。创建两种不同的方法。