繁体   English   中英

python @abstractmethod 装饰器

[英]python @abstractmethod decorator

我已经阅读了关于抽象基类的 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()

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

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

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

您是否使用 python3 来运行该代码? 如果是,您应该知道在 python3 中声明元类有更改,您应该这样做:

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return

完整代码和答案背后的解释是:

import abc

class AbstractClass(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def abstractMethod(self):
        return

class ConcreteClass(AbstractClass):

    def __init__(self):
        self.me = "me"

# Will get a TypeError without the following two lines:
#   def abstractMethod(self):
#       return 0

c = ConcreteClass()
c.abstractMethod()

如果未为ConcreteClass定义abstractMethod ,则在运行上述代码时将引发以下异常: TypeError: Can't instantiate abstract class ConcreteClass with abstract methods abstractMethod

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 测试

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM