阅读有关Python类型的描述string-like
或byte-like
引起了我的注意。我找不到一个适当的定义,这些到底是什么意思以及如何正确使用这些术语。例如,我在以下Python Cookbook
部分阅读:
basestring
是str
和unicode
类型的公共基类,用户代码可能定义的任何类似字符串的类型也应该basestring
子类,只是为了确保此类isinstance
测试按预期工作。
那么现在说任何从basestring
派生的东西都可以被认为是字符串状的,这是否正确?甚至是什么让它string-like
,它是返回类型?
<type>-like
是任何与该类型类似的对象。Python 广泛依赖鸭子类型;如果它像鸭子一样走路和嘎嘎叫,那就是鸭子。如果它的行为像一个字符串,它可能是一个。
因此,文档告诉您,如果您要创建一个希望在任何地方都被视为字符串的自定义类型,那么子类化basestring
可能是一个想法。 这样,任何明确想要使用isinstance(obj, basestring)
测试字符串类型(字节或 unicode 文本)的代码也将接受您的自定义类型。
你仍然必须实现最少的预期方法集;从basestring
继承不会神奇地使你的类型工作。该最小设置取决于您尝试欺骗的代码如何操作字符串。你的类型必须足够像字符串,才能欺骗你使用你的类型的任何内容。
是的,这是故意模糊的,并不是所有代码都可以被欺骗(一些内置函数和类型希望能够在字符串对象上使用 C API,甚至进入str
内部)。通常,更容易只对str
或unicode
进行子类化,以确保不会遗漏任何内容。
从那以后,该语言已经摆脱了这样的基类,而是定义了抽象基类,现在,这些基类与用于自定义子类和实例检查的钩子一起,是在一个检查中进行鸭子输入的推荐方法。