Python:不应该使用的神奇方法

2024-05-01 16:21:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个类,它是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.

Tags: 方法key代码selfvaluedefalways元组
3条回答

实现其中一个或另一个,或者两者都实现(如果它们对自定义类有意义)。在

{{{1>你可以在cd2>中实现的语法。在

如果您实现__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{A>协议使用

如果你的类应该是一个正确的元组子类型(根据Liskov substitution principle),那么它的行为方式应该与元组wrt/to set/del相同——如果你不定义__setitem____delitem__,那么这是默认行为。我不认为那会属于“拒绝遗产”的范畴。在

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

相关问题 更多 >