【发布时间】:2016-12-14 21:52:20
【问题描述】:
我试图弄清楚如何确保使用适当的装饰器创建从 ABC 继承的类的方法。我(希望)了解 ABC 的一般工作原理。
from abc import ABCMeta, abstractmethod
class MyABC(metaclass=ABCMeta):
@abstractmethod
def my_abstract_method(self):
pass
class MyClass(MyABC):
pass
MyClass()
这给出了“TypeError:无法使用抽象方法 my_abstract_method 实例化抽象类 MyClass”。太好了,有道理。只需创建一个具有该名称的方法即可。
class MyClass(MyABC):
def my_abstract_method(self):
pass
MyClass()
轰隆隆。你完成了。但是这个案子呢?
from abc import ABCMeta, abstractmethod
class MyABC(metaclass=ABCMeta):
@property
@abstractmethod
def my_attribute(self):
pass
class MyClass(MyABC):
def my_attribute(self):
pass
MyClass()
即使 my_attribute 不是属性,MyClass() 调用仍然有效。我想最终所有 ABC 所做的都是确保存在具有给定名称的方法。而已。如果您想从中获得更多信息,则必须查看 MyABC 的源代码并阅读文档。那里的装饰器和 cmets 会告知您需要如何构建子类。
我说得对还是我在这里遗漏了什么?
【问题讨论】:
-
这就是
abstractproperty的用途。 -
abstractproperty在 python 3.3 中已弃用。 OP 对 3.3+ 有正确用法;@property和@abstractmethod在基类中,@property在子类中。但是,您不能强制子类正确实现它。