python @abstractmethod装饰

时间:2011-08-25 19:53:10

标签: python abc abstract-methods

我已阅读有关抽象基类的python文档:

来自here

  

abc.abstractmethod(function)   指示抽象方法的装饰者。

     

使用此装饰器要求类的元类是ABCMeta或   源自它。具有从ABCMeta派生的元类的类   除非所有的抽象方法和方法都无法实例化   属性被覆盖。

here

  

您可以将@abstractmethod装饰器应用于draw()等方法   必须实施;然后Python将引发异常   没有定义方法的类。请注意,例外情况仅限于此   当你真正尝试创建一个子类的实例时引发   缺乏方法。

我已经用这段代码测试了一下:

import abc

class AbstractClass(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def abstractMethod(self):
    return

class ConcreteClass(AbstractClass):
  def __init__(self):
    self.me = "me"

c = ConcreteClass()
c.abstractMethod()

代码很好,所以我不明白。如果我输入c.abstractMethod,我会得到:

<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>>

我在这里缺少什么? ConcreteClass 必须实现抽象方法,但我也不例外。

2 个答案:

答案 0 :(得分:35)

您使用python3运行该代码吗?如果是的话你应该知道在python 3 have changes中声明元类你应该这样做:

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return

答案 1 :(得分:3)

ABC 导入 abc 并使您自己的抽象类成为 ABC 的子类有助于使代码看起来更简洁。

from abc import ABC, abstractmethod

class AbstractClass(ABC):

  @abstractmethod
  def abstractMethod(self):
    return

class ConcreteClass(AbstractClass):
  def __init__(self):
    self.me = "me"

# The following raise the TypeError complaining abstracteMethod is not impliemented
c = ConcreteClass()  

使用 Python 3.6 测试