2016-11-22 4 views
0

私はtupleラッパーであり、タプルはアイテムの突然変異をサポートしていないクラスを作成しました。 __setitem____delitem__の実装を残すか、たとえば次のようなメソッドを実装する必要があります。以下のようになります(したがって、拒否された遺贈のコードのにおいの種類になります)?どちらのアプローチがより無性であるか?そのような場合にカスタム例外は改善されませんか?Python:使用すべきでない魔法のメソッド

def __setitem__(self, key, value): 
    """ 
    :raise: Always. 
    :raises: TypeError 
    """ 
    self.data_set[key] = value # Raise from tuple. 

def __delitem__(self, key): 
    """ 
    :raise: Always. 
    :raises: TypeError 
    """ 
    raise TypeError("Item deletion is unsupported") # Custom exceptions thrown. 

答えて

1

クラスが適切なタプルサブタイプ(Liskov substitution principleによる)であると想定されている場合、あなたがちょうど__setitem____delitem__のどちらも定義していなければ、Guillaumeが言及しているように、デフォルトの振る舞いです。それが「拒絶された遺産」カテゴリにどのように分類されるのかわかりません。

あなたのクラスがその実装の一部としてタプルを使用していますが、適切なタプルのサブタイプではないと思われる場合は何でも構いませんが、アイテムの割り当て/削除を許可したくない場合は、それらを実装しないことです。

+0

私はこのクラスが '__setitem__'と' __delitem__'を実装すると主張していますが、その動作はそれらの操作をサポートしていないことを示しています。 – JCode

+1

AOK。実際に(私が言及したように)目標がアイテムの割り当てと削除をサポートしない場合、実際にはこれらのメソッドを実装するのは意味をなさない。 –

0

カスタムクラスに適している場合は、どちらか一方または両方を実装します。

__setitem__()を実装した場合、コードにyourobject[yourindex] = yourvalueの構文(実装する意味を持つ)を使用できます。

あなたが__delitem__()を実装する場合は、それだけの例外を発生させるために明示的にメソッドを実装しても意味がありませんdel yourobject[yourindex]

を使用することができます、Pythonはデフォルトでそれを行います。

class Test(object): 
    pass 
test = Test() 
test['foo'] = 'bar' # will call Test.__setitem__() which is not explicitly defined 

が得られますTypeError: 'Test' object does not support item assignment

1

これは味の問題ですが、私はそれらをまったく実装すべきではないと思います。 __setitem__, __delitem__を持つクラスは、可変コレクションプロトコル(暗黙的に、またはcollection abstract base classesを使用して明示的にさえ)を実装します。あなたのクラスはこのインターフェースをサポートしていません。それだけです。ユーザーは理由も想定する権利もありません。

関連する問題