【发布时间】:2014-03-03 20:47:51
【问题描述】:
在Python中实现纯虚方法的思想正确的方法是什么?
只是在方法中提高NotImplementedError?
或者有没有更好的方法?
谢谢!
【问题讨论】:
标签: python oop inheritance virtual-functions
在Python中实现纯虚方法的思想正确的方法是什么?
只是在方法中提高NotImplementedError?
或者有没有更好的方法?
谢谢!
【问题讨论】:
标签: python oop inheritance virtual-functions
虽然看到people using NotImplementedError 并不少见,但有些人会争辩说,“正确”的做法(从python 2.6 开始)是通过abc module 使用抽象基类:
from abc import ABCMeta, abstractmethod
class MyAbstractClass(object):
__metaclass__=ABCMeta
@abstractmethod
def my_abstract_method():
pass
与使用NotImplementedError 相比,使用abc 有两个主要(潜在)优势。
首先,您将无法实例化抽象类(无需__init__ hacks):
>>> MyAbstractClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class MyAbstractClass with abstract methods my_abstract_method
其次,您将无法实例化任何未实现所有抽象方法的子类:
>>> class MyConcreteClass(MyAbstractClass):
... pass
...
>>> MyConcreteClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class MyConcreteClass with abstract methods my_abstract_method
【讨论】: