2016-11-22 15 views
0

我创建了一个类,它是一个tuple包装器,元组不支持项目突变。 我应该离开__setitem____delitem__的实现或实现像例如下面(因此属于Refused Bequest代码的气味)?哪种方法更pythonic?在这种情况下,定制异常是否更好?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)适当的元组亚型,那么它应该的行为与元组wrt/set/del相同 - 正如Guillaume所提到的,如果你既不定义__setitem__也不定义__delitem__。我不明白这会落入“拒绝遗赠”类别。

如果你的类使用一个元组作为它的实现的一部分,但不应该是一个适当的元组子类型,那么做任何有意义的事情 - 但如果你不想允许项目分配/删除,那么最简单的事情是不执行它们的。

+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)。您的类只是不支持这个接口,就是这样,用户既没有理由,也没有正确的假设它确实

相关问题