【问题标题】:Method invoked on while verification of collection验证集合时调用的方法
【发布时间】:2017-09-28 05:54:29
【问题描述】:

假设我有一个列表Q。在以下代码中:

while Q:
    do_something()
    Q.pop()

while Q 语句中,调用列表Q 的哪个方法?是__len__ 方法吗?

【问题讨论】:

  • 为什么会是len?而且len 无论如何都不是列表中的方法。 __len__ 就是方法。
  • @Carcigenicate 实际上是 __ len __。编辑器将“__”转换为粗体。感谢您的警告
  • 啊。将小代码位包装在反引号中以防止标记尝试是个好主意。但是,为什么要提到__len__?它可能在幕后被调用,但在这段代码 sn-p 中,pop 是被调用的方法。
  • @Carcigenicate 他在问如何将Q 视为布尔值,这可能涉及到调用__len__

标签: python


【解决方案1】:

在 Python 3.x 中,它是 __bool____len__

object.__bool__(self)

调用以实现真值测试和内置操作 bool();应该返回FalseTrue。当这个方法不 定义,__len__() 被调用,如果它被定义,并且对象是 如果其结果为非零,则认为为真。如果一个类既不定义 __len__()__bool__(),它的所有实例都被认为是真的。

在 2.x 中它被命名为__nonzero__;见what's new in 3.0

【讨论】:

    【解决方案2】:

    来自python's documentation

    可以测试任何对象的真值,用于ifwhile 条件或作为以下布尔运算的操作数。以下值被认为是错误的:

    • (...)
    • 任何空序列,例如,''()[]
    • (...)
    • 用户定义类的实例,如果该类定义了__bool__()__len__() 方法,则当该方法返回整数零或boolFalse。 [有关这些特殊方法的更多信息,请参阅 Python 参考手册 (Basic customization)。]

    所有其他值都被认为是真——所以许多类型的对象总是真。

    除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0False 为假,1True 为真。 (重要的例外:布尔运算 orand 总是返回它们的操作数之一。)

    【讨论】:

      【解决方案3】:

      是的,__len__ 在这种情况下会被调用。

      让我们看看这段代码sn-p:

      class clist(list):
      
          def __len__(self):
              print "Called"
      
      Q = clist([1,2,3,4])
      
      while Q:
          break
      

      输出:

      Called
      Traceback (most recent call last):
        File "a.py", line 10, in <module>
          while Q:
      TypeError: an integer is required
      

      但是,如果我删除该方法,

      class clist(list):
          pass
      
      Q = clist([1,2,3,4])
      
      while Q:
          break    
      

      代码可以正常运行,但不会打印任何内容。

      所以是的,__len__ 确实被调用了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多