Python 为什么str不是collections.abc.ByteString的子类?
查看Python中的类型Python 为什么str不是collections.abc.ByteString的子类?,python,abstract-class,abc,Python,Abstract Class,Abc,查看Python中的类型str和bytes,发现它们非常相似。唯一的区别在于。它们的特点是: >>> set(dir(bytes)) - set(dir(str)) {'hex', 'fromhex', 'decode'} >>> set(dir(str)) - set(dir(bytes)) {'isidentifier', 'encode', 'isdecimal', 'isnumeric', 'casefold', 'format', 'isprinta
str
和bytes
,发现它们非常相似。唯一的区别在于。它们的特点是:
>>> set(dir(bytes)) - set(dir(str))
{'hex', 'fromhex', 'decode'}
>>> set(dir(str)) - set(dir(bytes))
{'isidentifier', 'encode', 'isdecimal', 'isnumeric', 'casefold', 'format', 'isprintable', 'format_map'}
通过检查,我发现这些差异与抽象基类collections.abc.ByteString
的关系不相关。但是,bytes
被视为一个子类,而str
则不是:
>>> issubclass(bytes, collections.abc.ByteString)
True
>>> issubclass(str, collections.abc.ByteString)
False
虽然观察到的行为有助于识别这些类型,但我不理解Python为什么会这样做。在我对Python的duck类型概念的理解中,
str
和bytes
都应该被视为子类,只要它们带有相关属性。Astr
不是一个字节字符串ByteString
的含义不包含在其方法中,str
不符合ByteString
的含义。(ABC主要作为捆绑字节
和字节数组
的方式存在,用于isinstance
检查,因此在其docstring中使用“This unified bytes and bytearray.”
您可能会想,为什么代码>子类< /CODE>不会根据其方法自动考虑<代码> STR <代码> A<代码> ByTeScord< /Cord>子类。除非ABC专门实现检查方法,否则,代码> ISSub类< /C>不会根据任何特定方法的存在自动考虑ABC的A类子类。code>bytes和
bytearray
是ByteString
的子类,因为它们被专门定义为子类。Astr
不是一个字节字符串ByteString
的含义不包含在其方法中,str
不符合ByteString
的含义。(ABC主要作为捆绑字节
和字节数组
的方式存在,用于isinstance
检查,因此在其docstring中使用“This unified bytes and bytearray.”
您可能会想,为什么代码>子类< /CODE>不会根据其方法自动考虑<代码> STR <代码> A<代码> ByTeScord< /Cord>子类。除非ABC专门实现检查方法,否则,代码> ISSub类< /C>不会根据任何特定方法的存在自动考虑ABC的A类子类。code>bytes和
bytearray
是ByteString
的子类,因为它们被专门定义为子类。从实用角度来看,str
和bytes
不能相互替代,因此,让它们成为比Iterable
或Hashable
或size
更具体的子类没有任何用处
如果您想互换使用它们,程序中可能有一个bug。从实际角度来看,
str
和字节
不能相互替代,因此,让它们成为比Iterable
或Hashable
或size
更具体的子类没有任何用处
如果您想互换使用它们,程序中可能有一个bug。刚刚查看了
\u collections\u abc.py
源代码:虽然许多(更简单的)abc实现\u subclasshook\uu
以检查现有方法,ByteString
不仅注册bytes
和bytearray
。只看了一下\u集合\u abc.py
源代码:虽然许多(更简单的)abc实现了\u子类hook\uuu
来检查现有的方法,ByteString
不注册且仅注册bytes
和bytearray
。