12

假设我想在 Python 中创建一个抽象类,其中包含一些由子类实现的方法,例如:

class Base():
    def f(self):
        print "Hello."
        self.g()
        print "Bye!" 

class A(Base):
    def g(self):
        print "I am A"

class B(Base):
    def g(self):
        print "I am B"

我希望如果基类被实例化并且它的f()方法被调用,当self.g()被调用时,它会抛出一个异常,告诉你一个子类应该已经实现了 method g()

通常在这里做什么?我应该提出一个NotImplementedError?还是有更具体的方法?

4

3 回答 3

15

在 Python 2.6 及更高版本中,您可以使用abc模块来创建Base“实际上”的抽象基类:

import abc

class Base:
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def g(self):
        pass
    def f(self): # &c

这保证了Base不能被实例化——任何未能覆盖的子类也不能g——同时满足@Aaron 允许子类super在其g实现中使用的目标。总的来说,这是一个比我们以前在 Python 2.5 和更早版本中更好的解决方案!

旁注:从对象继承 Base 是多余的,因为无论如何都需要显式设置元类。

于 2010-08-13T03:58:50.603 回答
2

制作一个什么都不做的方法,但仍然有一个解释接口的文档字符串。获取 aNameError令人困惑,并且引发NotImplementedError(或任何其他例外,就此而言)将破坏super.

于 2010-08-13T03:28:03.187 回答
0

Peter Norvig 在他的 Python Infrequently Asked Questions列表中给出了一个解决方案。我会在这里重现它。一定要检查室内空气质量,它非常有用。

## Python
class MyAbstractClass:
    def method1(self): abstract

class MyClass(MyAbstractClass): 
    pass

def abstract():
    import inspect
    caller = inspect.getouterframes(inspect.currentframe())[1][3]
    raise NotImplementedError(caller + ' must be implemented in subclass')
于 2010-08-13T04:30:48.920 回答