在Python中实现与接口类似的东西有什么好方法?

时间:2013-01-07 11:34:04

标签: python types interface

在Python中实现类似于Delphi / C#接口或抽象类的好方法是什么?一个强制所有子类实现一组特定方法的类?

1 个答案:

答案 0 :(得分:5)

最简单的方法是使用自2.7版本以来Python中包含的抽象基类实现。

这允许您使用abc.ABCMeta元类将基类标记为抽象。然后,您可以将方法和属性标记为抽象。当您使用ABCMeta元类(或其任何子类)实例化一个类时,如果实例中未定义任何抽象属性或方法,则会抛出异常。

e.g。

>>> from abc import ABCMeta, abstractmethod
>>> class Foo(object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def bar(self): pass


>>> class BadFoo(Foo):
    pass

>>> BadFoo()

Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    BadFoo()
TypeError: Can't instantiate abstract class BadFoo with abstract methods bar
>>> class GoodFoo(Foo):
    def bar(self):
        return 42


>>> GoodFoo()
<__main__.GoodFoo object at 0x027354B0>
>>> 

只有在实例化类时才进行检查,因为拥有仅实现某些抽象方法的子类是完全合法的,因此它本身就是一个抽象类。