gpt4 book ai didi

python - 抽象基类与鸭子类型(duck typing)

转载 作者:太空狗 更新时间:2023-10-30 03:03:34 26 4
gpt4 key购买 nike

Python 有特定的 ABCs for container types .它说它们是,“……用于测试类是否提供特定接口(interface)。” (而且它们对某些混入也很有用,但我们暂时忽略它。)

我无法弄清楚为什么其中一些 ABC 非常有用。也许我的问题只是文档中的示例过于学术化,但使用这些示例:

# Verbatim
size = None
if isinstance(myvar, collections.abc.Sized):
size = len(myvar)

# Is that so much better than
size = None
if hasattr(myvar, '__len__'):
size = len(myvar)

在第二种情况下,您避免了导入,代码对我来说似乎更明确。您可以从其名称推断出 collections.abc.Sized 的含义,或者查找它,但它并不像“如果它有长度,就获取它的长度”那样明确。

集合类型测试的 abc 方法是否真的比显式 hasattr 测试更符合 Python 的习惯,如果是,为什么? (在这种情况下,简单优于复杂胜过显式优于隐式吗?)

最佳答案

您可以使用任何一种方法获得相同的结果。 ABC 方法的主要好处是为您提供了一些逻辑。例如,要通过鸭子类型(duck typing)实现 Set 类型,您必须编写和测试 14 个接口(interface) - __contains__, __iter__, __len__, __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__, __sub__, __xor__ , 并且不相交

但是如果你使用ABC,你只需要定义__contains__、__iter__和__len__——ABC使用你提供的这些函数来为你实现剩下的11个方法。 ABC 做你会做的事,但更省力。这是一条通往相同目的地的捷径。

关于python - 抽象基类与鸭子类型(duck typing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18430970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com