python @abstractmethod装饰

Seb*_*ian 31 python abc abstract-methods

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

这里:

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

使用这个装饰器需要该类的元类是ABCMeta从它派生的.ABCMeta 除非所有抽象方法和属性都被覆盖,否则无法实例化具有派生自元类的类.

在这里

您可以将@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()
Run Code Online (Sandbox Code Playgroud)

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

<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>>
Run Code Online (Sandbox Code Playgroud)

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

mou*_*uad 46

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

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return
Run Code Online (Sandbox Code Playgroud)

  • @Sebastian:`python3`的设计与它的先例python2(http://www.python.org/dev/peps/pep-3000/#compatibility-and-transition)的向后兼容性较差,但要解决两者之间的向后不兼容问题您应该使用2to3.py脚本(http://docs.python.org/library/2to3.html). (2认同)
  • 如果你想从概念上理解更多。请参考 Raymond Hettinger 的这段视频。https://www.youtube.com/watch?v=S_ipdVNSFlo (2认同)

l00*_*01d 25

导入自己的抽象类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 would raise a TypeError complaining 
# abstractMethod is not implemented
c = ConcreteClass()  
Run Code Online (Sandbox Code Playgroud)

使用 Python 3.6 进行测试