我已阅读有关抽象基类的python文档:
来自here:
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
必须实现抽象方法,但我也不例外。
答案 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 测试