2011-10-05 18 views
0

私はC#の構文に慣れていて、たとえば、文字列のリストをList<string> MyListで作成しています。Python 2.5の "型付きリスト"の作成

コレクションタイプにない型を追加しようとすると、同じような構文でpythonが失敗するでしょうか?

+0

カスタムクラスを作成する必要があります。このような機能はPythonでは存在しません – NullUserException

+0

これはPythonの方法ではありません。これをコードで内部的に使用する場合は、文字列以外をリストに入れないでください。これを書いているモジュールのユーザーに公開する場合は、正しく文書化してください。このようにして、リストには文字列のように振る舞いますが、必ずしも文字列である必要はありません。詳細については、「ダックタイピング」およびEAFPを参照してください。 – yak

答えて

1

、Pythonは内蔵のようなものを持っていません。

あなたがそのようなものを作りたいと思った場合は、ビルトインlist()クラスをサブクラス化し、許可するすべてのメソッドになるだろう要素の挿入や追加は型チェックを行います。または、型チェックの代わりに、カスタムメソッドが型を強要しようとする可能性があります。

ここにはint()の値しか保持しないリストの実装例があります。挿入または追加しようとするものを強制し、適切なエラーを発生させます。私は組み込みのlist()型をサブクラス化したので、私が書いたコードは単なる例外です。あなたがここに表示されていないものは、ベースのタイプlist()とまったく同じです。私はちょうどいくつかの方法をフックする必要がありました。また、リストや他のシーケンスを受け入れ、オブジェクトを初期化するカスタムの.__init__()メソッドを与えました。

これは不完全な実装です。たとえば、.insert()メソッドをオーバーライドしません。しかし、私はそれがあなたに基本的なアイデアを示すと思っています。もしあなたが本当にIntList()クラスを欲しければ、これをベースとして使うことができます。

class IntList(list): 
    def __init__(self, seq=None): 
     if seq is not None: 
      try: 
       for x in seq: 
        self.append(int(x)) 
      except ValueError: 
       raise ValueError, "can only use int values to init IntList" 
    def __setitem__(self, i, x): 
     try: 
      list.__setitem__(self, i, int(x)) 
     except ValueError: 
      raise ValueError, "can only set int values into IntList" 
    def append(self, x): 
     try: 
      list.append(self, int(x)) 
     except ValueError: 
      raise ValueError, "can only append int values to IntList" 


lst = [0, 1, 't'] 

try: 
    o = IntList(lst) # raises exception 
except ValueError: 
    print("lst has a 't' in it") 

o = IntList(range(3)) # works 

try: 
    o[1] = 't' 
except ValueError: 
    print("cannot set to 't'") 

o[1] = 2 # works 

o.append(4) # works 
o.append('t') # raises error 

上記プリント:

lst has a 't' in it 
cannot set to 't' 
Traceback (most recent call last): 
    File "t.py", line 38, in <module> 
    o.append('t') # raises error 
    File "t.py", line 18, in append 
    raise ValueError, "can only append int values to IntList" 
ValueError: can only append int values to IntList 

.__init__()機能でリスト引数にNoneに設定されたデフォルト引数を持つの一般的なPythonのイディオムがあります。これは、デフォルト値リストはコンパイル時に1回だけ評価され、このリストへの参照を保存すると、そのクラスのすべてのインスタンスが同じインスタンスを共有することになります。この場合、私たちはループ上でループを反復して自分自身のコピーを作成するので、実際にこのイディオムを行う必要はありません。私はこれを読んでいる初心者のためにイディオムの例を挙げたいと思っていました。

1

いいえ__*item__() methodsを適切に実装するカスタムクラスを作成する必要があります。他の人が言ったように

+0

私はまだPythonの学習者ですが、実際に__ * item __()メソッドを使用する例はありますか? (私はGoogleのアプリケーションエンジンで作業しているので、具体的にはPython 2.5を使用しています) –

+0

上記の答えで「メソッド」という言葉をクリックしてみてください。これはPythonのドキュメントページへのリンクです。 – steveha

関連する問題