受到一个很棒的问题(以及一堆很棒的答案)的启发here. https://stackoverflow.com/questions/4456424/what-do-programmers-mean-when-they-say-code-against-an-interface-not-an-object
“针对接口而不是对象进行编码”这句话在 Python 中有意义吗?
我正在寻找类似的答案原始问题 https://stackoverflow.com/questions/4456424/what-do-programmers-mean-when-they-say-code-against-an-interface-not-an-object但有 Python 片段和想法。
“针对接口而不是对象进行编码”在 Python 中没有字面意义,因为该语言没有接口功能。这roughPython 相当于“使用鸭子类型”。换句话说,如果你想知道一个对象是否是鸭子,你应该检查它是否有quack()
方法,或者更好地尝试quack()
并提供适当的错误处理,而不是测试它是否是一个实例Duck
.
Python 中常见的鸭子类型是文件(实际上是类似文件的对象)、映射(dict
类对象)、可调用对象(类函数对象)、序列(list
-like 对象)和可迭代对象(可以迭代的东西,可以是容器或生成器)。
例如,需要文件的 Python 功能通常会很乐意接受实现以下方法的对象:file
它需要;它不必源自file
班级。例如,要使用一个对象作为标准输出,它需要的主要内容是write()
方法(也许flush()
and close()
,实际上不需要做任何事情)。类似地,可调用对象是任何具有__call__()
方法;它不需要从函数类型派生(事实上,您不能从函数类型派生)。
您应该采取类似的方法。检查要对对象执行的操作所需的方法和属性。更好的是,记录你的期望,并假设调用你的代码的人不是一个彻头彻尾的傻瓜。 (如果他们给你一个你不能使用的对象,他们肯定会从他们得到的错误中足够快地找出来。)仅在必要时测试特定类型。它is有时是必要的,这就是为什么Python给你type()
, isinstance()
, and issubclass()
,但要小心他们。
Python 的鸭子类型相当于“针对接口而不是对象编写代码”,因为建议您不要让代码过于依赖对象的类型,而是查看它是否具有您需要的接口。不同之处在于,在Python中,“接口”只是指提供某种行为的对象的属性和方法的非正式捆绑,而不是专门命名的语言构造interface
.
您可以使用以下方式在某种程度上将 Python“接口”形式化:abc
模块,它允许您使用您想要的任何标准(例如“它具有属性”)来声明给定类是给定“抽象基类”(接口)的子类color
, tail_length
, and quack
, and quack
可调用。”但这仍然比具有接口功能的静态语言严格得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)