根据Python datamodel documentation, for the object.__nonzero__ method,这是可行的(但会违反rule of least surprise, or principle of least astonishment):
调用以实现真值测试和内置操作
布尔();应该返回 False 或 True,或它们的整数等价物 0 或
1、当该方法没有定义时,如果定义了,则调用len(),如果对象的结果为非零,则认为该对象为真。
如果一个类既没有定义 len() 也没有定义 nonzero(),它的所有
实例被认为是真实的。
因此假设,我们可以检查 len() == 0,如果是则返回 True,并且
然后使用默认值进行布尔检查:
class FunkyList(list):
def __nonzero__(self):
if self.__len__() == 0:
return True
else:
return self.__len__()
__bool__ = __nonzero__ # Python 3 uses __bool__ instead of __nonzero
但由于逻辑树的两种情况都会导致布尔值为 True,因此上述可以简化为:
class FunkyList(list):
def __nonzero__(self):
return True
__bool__ = __nonzero__ # Python 3 uses __bool__ instead of __nonzero
我们看到它有效并且看起来像一个列表:
>>> fl = FunkyList()
>>> fl
[]
>>> isinstance(fl, list)
True
现在空 FunkyList 的 bool() 返回 True
>>> bool(fl)
True
而且它没有破解__len__ 方法。
>>> len(fl)
0
无论如何,我不明白您为什么希望 len 0 的列表返回 True。
感谢您提出如此有趣的问题,但我希望这是学术问题,而不是实际问题。执行此检查是 Python 的惯用做法:
>>> if fl:
... print True
...
True
并且任何有 Python 经验的人都会期望如果列表为空,则返回 False,而实现它的结果可能会让任何用户对你非常不满。