2016-11-10 4 views
-2
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. if self.mutable == Истинно, имя экземпляра вызываемого объекта изменяется и метод возвращает None Итак, если origin = Point (0,0) и мы вызываем origin._replace (y = 5), тогда print (origin) будет отображаться как Point (x = 0, y = 5), потому что происхождение мутируется.как исправить метод _replace

Если self.mutable == False, он возвращает новый объект того же класса, значения экземпляра которого совпадают, за исключением тех, которые указаны в kargs. Итак, если origin = Point (0,0), и мы вызываем new_origin = origin._replace (y = 5), тогда print (origin, new_origin) будет отображаться как Точка (x = 0, y = 0) Точка (x = 0 , y = 5), потому что происхождение не мутировано

Я не уверен, что не так с моей функцией _replace, может кто-нибудь помочь мне исправить это? спасибо

+0

Правильно отформатируйте тело текста, используя '' like '' – martianwars

ответ

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(). Создайте два разных метода.

+0

Я бы пересмотрел весь подход. должен существовать абстрактный базовый класс, который имеет либо изменчивую, либо неизменную реализацию - смешивание обоих подходов с самого начала кажется неудачным. –

Смежные вопросы