python@abstractmethod装饰器

python@abstractmethod装饰器,python,abc,abstract-methods,Python,Abc,Abstract Methods,我已经阅读了关于抽象基类的python文档: 发件人: abc.abstractmethod(函数) 表示抽象方法的装饰器 使用此修饰符要求类的元类为ABCMeta或 是从它衍生出来的。具有派生自ABCMeta 除非其所有抽象方法和 属性被覆盖 及 您可以将@abstractmethod装饰器应用于draw()等方法 这必须得到执行;Python随后将引发一个异常 未定义方法的类。请注意,例外情况仅限于 在实际尝试创建子类的实例时引发 缺乏方法 我已使用此代码对此进行了测试: 导入abc 类抽象

我已经阅读了关于抽象基类的python文档:

发件人:

abc.abstractmethod(函数)
表示抽象方法的装饰器

使用此修饰符要求类的元类为
ABCMeta
或 是从它衍生出来的。具有派生自
ABCMeta
除非其所有抽象方法和 属性被覆盖

您可以将
@abstractmethod
装饰器应用于draw()等方法 这必须得到执行;Python随后将引发一个异常 未定义方法的类。请注意,例外情况仅限于 在实际尝试创建子类的实例时引发 缺乏方法

我已使用此代码对此进行了测试:

导入abc
类抽象类(对象):
__元类_uu=abc.ABCMeta
@抽象方法
def抽象方法(self):
返回
类具体类(抽象类):
定义初始化(自):
self.me=“我”
c=混凝土类()
c、 抽象方法()
代码运行正常,所以我不明白。如果我键入
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:无法使用抽象方法abstractMethod实例化抽象类ConcreteClass
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测试

哪种Python?它报告的错误对我来说很好。另外,您也可以随时提出NotImplementedError,而不是使用
abc
。我在mouad回答上发表了一条评论,来自
python
的链接被设置为默认的
python3
。我会记住提出一个例外,因为在python上编写带有这些更改的可移植代码似乎与我的python知识相去甚远。谢谢,这似乎是版本之间的巨大变化(我的发行版将
python
默认为
python3
)。如何编写以实现向后兼容性?我想这可能是另一个问题…@Sebastian:
python3
的设计与它的前身python2()的向后兼容性较差,但要解决两个版本之间的向后不兼容问题,你应该使用2to3.py脚本()。很好,我已经测试过了。我可以继续使用
\uuuu元类\uuuu
语法,并使用该脚本转换为
python3
语法。它只是做了你在例子中所说的。谢谢。如果你想从概念上理解更多,你也可以用六个:来代替2to3。请参考雷蒙德·赫廷格的视频。