为'len'和'bool'模仿Python行为`

为'len'和'bool'模仿Python行为`,python,class,built-in,Python,Class,Built In,考虑以下代码: >>>X类: ... 通过 ... >>>x=x >>>伦克斯 回溯最近一次呼叫上次: 文件,第1行,在 TypeError:类型为“X”的对象没有len >>>博克斯 符合事实的 但是,当试图模仿这种写作时,它是行不通的 >>>Y类: ... def___________________________自已: ... 提高打字错误 ... >>>y=y >>>莱尼 回溯最近一次呼叫上次: 文件,第1行,在 文件,第3行,在__ 打字错误 >>>粗野的 回溯最近一次呼

考虑以下代码:

>>>X类: ... 通过 ... >>>x=x >>>伦克斯 回溯最近一次呼叫上次: 文件,第1行,在 TypeError:类型为“X”的对象没有len >>>博克斯 符合事实的 但是,当试图模仿这种写作时,它是行不通的

>>>Y类: ... def___________________________自已: ... 提高打字错误 ... >>>y=y >>>莱尼 回溯最近一次呼叫上次: 文件,第1行,在 文件,第3行,在__ 打字错误 >>>粗野的 回溯最近一次呼叫上次: 文件,第1行,在 文件,第3行,在__ 打字错误 有没有一种方法可以编写一个像未实现一样工作的_len__函数?

bool测试一个对象的真值,所以您想看看:

默认情况下,对象被视为true,除非其类定义了返回False的_ubool__;方法或与对象一起调用时返回零的__len___;方法

您只实现了一个故意破坏的_len______)方法,在调用时引发TypeError。但是bool会在有实现且没有其他选项可用于确定真值时调用它

确定真值时:

未定义此方法时,如果已定义,则调用_len _uuu;如果结果为非零,则认为该对象为真

演示:

请注意,当没有_len__钩子的实现时,是len函数实现引发TypeError。一个_ulen _uuu实现所引发的任何异常都不会让你认为它没有实际实现,它引发的任何异常都会在被调用时传播,因为你通常想知道实现是否以某种方式被破坏。

bool测试对象的真值,所以你想看看:

默认情况下,对象被视为true,除非其类定义了返回False的_ubool__;方法或与对象一起调用时返回零的__len___;方法

您只实现了一个故意破坏的_len______)方法,在调用时引发TypeError。但是bool会在有实现且没有其他选项可用于确定真值时调用它

确定真值时:

未定义此方法时,如果已定义,则调用_len _uuu;如果结果为非零,则认为该对象为真

演示:


请注意,当没有_len__钩子的实现时,是len函数实现引发TypeError。一个uu len_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u__u__________,您也可以实现_bool__,并让它做任何您想做的事情。@interjay python中的一个对象可以是真/假,原因有很多:数字如果不为零,则为真;容器如果不为空,则为真,等等。因此,bool会进行大量检查以确定使用哪一个。我想知道是否有一个模仿未实现行为的_len_uu_u_u的实现。我提出TypeError是因为没有实现的类就是这样做的。但是很明显,你提出TypeError的地方不是错误的来源,否则你所看到的就不会发生。凭直觉,我会说是len自己负责提出它,而没有_len ____________________________________________________@帕里托什唱歌,这也是我认为它的工作方式。bool检查方法是否存在并执行操作。我想知道是否有某种东西可以以同样的方式返回或引发。如果你想让bool即使在混乱的情况下也能工作,你也可以实现bool,并让它做任何你想做的事情。@interjay python中的一个对象在很多方面都可以是真/假:数字如果不为零,则为真,如果容器不是空的,那么容器是真的,等等。所以bool做了很多检查来确定使用哪一个。我想知道是否有一个模仿未实现行为的_len_uu_u_u的实现。我提出TypeError是因为没有实现的类就是这样做的。但是很明显,你提出TypeError的地方不是错误的来源,否则你所看到的就不会发生。凭直觉,我会说是len自己负责提出它,而没有_len ____________________________________________________@帕里托什唱歌,这也是我认为它的工作方式。bool检查方法是否存在并执行操作。我想知道是否有一种回报或筹集资金的方式是相同的。
>>> class Z:
...     def __bool__(self):
...         return True
...     def __len__(self):
...         raise TypeError
...
>>> len(Z())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in __len__
TypeError
>>> bool(Z())
True