[英]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.