2016-11-10 18 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に格納されている値によって異なります。 self.mutable == trueの場合、呼び出されたオブジェクトのインスタンスの名前が変更され、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)はPoint(x = 0、y = 0)として表示されます。Point 、y = 5)

私の関数_replaceに何が間違っているのか分かりませんが、誰か助けてもらえますか?ありがとう

+0

'' like 'を使ってテキストの本文を正しくフォーマットしてください ' – martianwars

答えて

1

あなたはと呼ばれる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()のこのオーバーロードされた使用を好きではない:あなたのいずれかは、あなたの__init__()方法を変更したり、kwargslistにマッピングする必要があります。 2つの異なるメソッドを作成します。

+0

私は全体のアプローチを再考します。変更可能または不変のいずれかの実装を持つ抽象基底クラスが存在しなければなりません。 –

関連する問題