2016-10-19 4 views
-1

私はMapsと呼ばれるクラスを持っており、そこから2つのリストllmを作成しました。 lは特定のイベントで変更する予定ですが、lm(メモリリスト)はそのままにしておきます。Python - リストクラスが変更されないようにする方法はありますか?

リストクラスが変更されないようにする方法はありますか? あなたを騙してください!あなたは異なるクラスを使用して、このようなものを定義したい場合があります

   if goalC.value>0 and goalC.value==lm.countX(): 
      lvlC.increment(1) 
      #lvl.config(text=" | Level Complete ", bg="limegreen") 
      l.nextLevel(lvlC.value) 
      lm.nextLevel(lvlC.value) 
      muvC.reinitialize() 
      nbMuv.config(text="Moves: "+str(muvC.value)) 
      pushC.reinitialize() 
      nbPush.config(text=" | Pushes: "+str(pushC.value)) 
      goalC.reinitialize() 
      nbGoal.config(text=" | Goals: "+str(goalC.value)) 
      lvl.config(text=" | Current level: "+str(lvlC.value), bg="darkgray") 
      print("New moves",muvC.value, "New pushes",pushC.value, "New level",lvlC.value) 
      print("New countX: ", lm.countX()) 
      print("New goals: ", goalC.value) 
      for i in l: 
       print(i) 
      for i in lm: 
       print(i) 
      can.delete("all") 
      for i in r: 
       for j in r: 
        time.sleep(.005) 
        can.create_rectangle(j*n, i*n, j*n+n, i*n+n, fill=fillSquare(i,j, l), outline="darkslategray") 
+5

「変更を防止する」とはどういう意味ですか?物事はそれ自身では変わらず、何かがそれを修正しなければならない。投稿したコードでは、何が起きているのか、何を望むのかを把握するのに十分ではありません。 [mcve]を作成してみてください。 – tzaman

+1

「(あなたの)リストクラスが変更されるのを防ぐ」という非常に簡単な方法があります。変更しないでください。これがあなたの質問に答えることができない場合は、より具体的な詳細とユースケースを使って質問に言いたいことがあります。 –

+0

また、継承(実装の継承 - それはPythonで継承を使用する唯一の理由です)は、ほとんどが構成/委任の非常に不自由な形式です。代わりに、コンポジション/デリゲートを使って 'Maps'クラスを書き直すことを強くお勧めします。最初はもう少し作業が必要ですが、実装全体の柔軟性と柔軟性を実現します。 –

答えて

3

class Maps(list): 

    def createInitial(self, lvlC): 
     #self.extend(mapDico[lvlC.value]) 

    #get (i,j) coords of "i" in l 
    def findI(self): 
     for ordinate, abscissa in enumerate(self): 
      try: 
       return (ordinate, abscissa.index("i")) 
      except: 
       pass 

    #get number of "x" in lm 
    def countX(self): 
     nbX=0 
     for rows in range(len(self)): 
      for elements in range(len(self)): 
       if self[rows][elements]=="x": 
        nbX+=1 
     return nbX 

    #load next map 
    def nextLevel(self, nxtL): 
     del self[:] 
     self.extend(mapDico[nxtL]) 

lvlC=Counters() 
lm=Maps() 
lm.createInitial(lvlC) 
l=Maps() 
l.createInitial(lvlC) 

は、ここで "コントローラ" ファイルを起動します。同じクラスのインスタンスを同時に変更可能で不変にすることは良い考えではありません。

だから私は別のtupleのサブクラス(不変)である1がlistのサブクラス(変更可能)で、あなたがMixinClass内のすべてのメソッドを定義して、2つのクラスを作成することをお勧め

+2

私が心配している限り、私はどちらか一方から継承しないでしょう - 作曲/代表団は過去17年間で100のうち99.9回私のために良く働いています。 –

+0

私は、構成と委任についてさらに詳しく説明します。ありがとうございました! – Chihab

1

たぶんそれ

class BaseMaps(list): 

def createInitial(self, lvlC): 
    #self.extend(mapDico[lvlC.value]) 

#get (i,j) coords of "i" in l 
def findI(self): 
    for ordinate, abscissa in enumerate(self): 
     try: 
      return (ordinate, abscissa.index("i")) 
     except: 
      pass 

#get number of "x" in lm 
def countX(self): 
    nbX=0 
    for rows in range(len(self)): 
     for elements in range(len(self)): 
      if self[rows][elements]=="x": 
       nbX+=1 
    return nbX 

#load next map 
def nextLevel(self, nxtL): 
    del self[:] 
    self.extend(mapDico[nxtL]) 



class Maps(BaseMaps): 

    pass 


class ReadOnlyMaps(BaseMaps): 
    def __init__(self, other): 
     self._list = other 

    def __getitem__(self, index): 
     return self._list[index] 

    def __iter__(self): 
     return iter(self._list) 

    def __slice__(self, *args, **kw): 
     return self._list.__slice__(*args, **kw) 

    def __repr__(self): 
     return repr(self._list) 

    def __len__(self): 
     return len(self._list) 

    def NotImplemented(self, *args, **kw): 
     raise ValueError("Read Only list proxy") 

    append = pop = __setitem__ = __setslice__ = __delitem__ = NotImplemented 
のようなもの
+0

'NotImplemented'は組み込みオブジェクトの名前なので、(クラス名前空間に含まれていても)その名前を別の目的で使うことはお勧めしません。また、すべてのリストインターフェースメソッドをオーバーライドしている場合、 'list'から継承する理由はありません。 – Blckknght

+0

私はリストを使って作業していると思った。しかし、私はすぐにこのことを読んで、私がそれをより良くするために何が変わるかを見ていきます。 – Chihab

関連する問題