Python中抽象类和接口的区别是什么?
当前回答
为了完整起见,我们应该提到PEP3119 其中引入了ABC并与接口进行了比较, 和塔林的原话。
抽象类不是完美的接口:
属于继承层次结构 是可变的
但如果你考虑用自己的方式写:
def some_function(self):
raise NotImplementedError()
interface = type(
'your_interface', (object,),
{'extra_func': some_function,
'__slots__': ['extra_func', ...]
...
'__instancecheck__': your_instance_checker,
'__subclasscheck__': your_subclass_checker
...
}
)
ok, rather as a class
or as a metaclass
and fighting with python to achieve the immutable object
and doing refactoring
...
你很快就会意识到你在白费力气 最终实现 美国广播公司(abc)。ABCMeta
美国广播公司(abc)。ABCMeta被提议作为缺少的接口功能的有用补充, 这在python这样的语言中是很合理的。
当然,在编写版本3时,它能够得到更好的增强,并添加新的语法和不可变的接口概念……
结论:
The abc.ABCMeta IS "pythonic" interface in python
其他回答
Python >= 2.6有抽象基类。
抽象基类(简称 (abc)补充鸭子打字 提供一种定义接口的方法 当其他技术如hasattr() 会很笨拙。Python自带 许多用于数据结构的内置abc (在集合模块中),数字 (在数字模块中),和流 (在IO模块)。你可以创建 你自己的ABC与ABC模块。
还有一个Zope Interface模块,它被Zope之外的项目使用,比如twisted。我不是很熟悉,但这里有一个维基页面可能会有帮助。
一般来说,在python中不需要抽象类或接口的概念(已编辑-详情请参阅S.Lott的回答)。
通常,接口只在使用单继承类模型的语言中使用。在这些单继承语言中,如果任何类都可以使用特定的方法或方法集,则通常使用接口。同样,在这些单继承语言中,抽象类被用来定义除了没有或多个方法之外的类变量,或者利用单继承模型来限制可以使用一组方法的类的范围。
支持多重继承模型的语言倾向于只使用类或抽象基类,而不使用接口。由于Python支持多重继承,因此它不使用接口,您可能希望使用基类或抽象基类。
http://docs.python.org/library/abc.html
抽象类是包含一个或多个抽象方法的类。除了抽象方法,抽象类还可以有静态方法、类方法和实例方法。 但在接口的情况下,它将只有抽象的方法没有其他。因此,继承抽象类不是强制性的,但继承接口是强制性的。
用更基本的方式解释: 界面有点像一个空的松饼盘。 它是一个类文件,带有一组没有代码的方法定义。
抽象类也是如此,但并非所有函数都需要为空。有些可以有代码。严格来说,它不是空的。
为什么区分: 在Python中没有太大的实际区别,但在大型项目的规划级别上,讨论接口可能更常见,因为没有代码。特别是当您与熟悉这个术语的Java程序员一起工作时。
为了完整起见,我们应该提到PEP3119 其中引入了ABC并与接口进行了比较, 和塔林的原话。
抽象类不是完美的接口:
属于继承层次结构 是可变的
但如果你考虑用自己的方式写:
def some_function(self):
raise NotImplementedError()
interface = type(
'your_interface', (object,),
{'extra_func': some_function,
'__slots__': ['extra_func', ...]
...
'__instancecheck__': your_instance_checker,
'__subclasscheck__': your_subclass_checker
...
}
)
ok, rather as a class
or as a metaclass
and fighting with python to achieve the immutable object
and doing refactoring
...
你很快就会意识到你在白费力气 最终实现 美国广播公司(abc)。ABCMeta
美国广播公司(abc)。ABCMeta被提议作为缺少的接口功能的有用补充, 这在python这样的语言中是很合理的。
当然,在编写版本3时,它能够得到更好的增强,并添加新的语法和不可变的接口概念……
结论:
The abc.ABCMeta IS "pythonic" interface in python
推荐文章
- 在Python中锁定文件
- 得到熊猫栏目的总数
- 从pandas DataFrame中删除名称包含特定字符串的列
- Mock vs MagicMock
- 如何阅读一个。xlsx文件使用熊猫库在iPython?
- 如何访问熊猫组由数据帧按键
- Pandas和NumPy+SciPy在Python中的区别是什么?
- 将列表转换为集合会改变元素的顺序
- 如何在matplotlib更新一个情节
- TypeError: ` NoneType `对象在Python中不可迭代
- 如何在Vim注释掉一个Python代码块
- python标准库中的装饰符(特别是@deprecated)
- 如何从外部访问本地Django web服务器
- 删除字符串的最后3个字符
- 在python中执行no-op的标准方法是什么?