Python子类列表

时间:2014-01-01 07:11:01

标签: python list operator-overloading overloading

我已经将内置Python列表子类化了。

在if结构中,空列表将评估为false,但我希望我的子类计算为true。

是否有可用的dunder方法可以在我的子类中覆盖以更改此行为?

2 个答案:

答案 0 :(得分:0)

根据Python datamodel documentation, for the object.__nonzero__ method,这是可行的(但它会违反rule of least surprise, or principle of least astonishment):

  

被要求实施真值测试和内置操作   布尔();应该返回False或True,或者它们的整数等于0或   1.如果未定义此方法,则调用 len ()(如果已定义),如果对象的结果非零,则认为该对象为true。   如果一个类既没有定义 len ()也没有定义非零(),那么   实例被认为是真实的。

因此假设,我们可以检查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

但由于逻辑树的两种情况都会导致bool为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,而实现这一点的结果可能会让任何用户对你不满意。

答案 1 :(得分:-4)

我不知道它对你有帮助,但我试过了...... list_1 = [[“a”,“b”]]其中''list_1'是列表名称,'[“a”,“b”]'是列表的子集。 如果你执行以下代码

list_1 = [["a","b"]];
if "a" in list_1:
     print ("true");
else:
     print ("false");

会给你“假”.....

如果您执行此代码

list_1 = [["a","b"]];
if "a" in list_1[0]:
     print ("true");
else:
     print ("false");

它会给你“真实”

通过这种方式,您可以访问列表中的子列表...