【发布时间】:2019-06-04 03:02:50
【问题描述】:
Python 3 文档提到 abc.abstractproperty 自 3.3 起已弃用,取而代之的是 @property 和 @abstractmethod。是否有另一种方法来实现与 Python 2 和 3 兼容的抽象属性(没有 abc.abstractproperty)?
我试过了
import abc
from future.utils import with_metaclass
class Base(with_metaclass(abc.ABCMeta, object)):
@property
@abc.abstractmethod
def x(self):
raise NotImplementedError
class C(Base):
pass
C()
在 Python 3 中正确引发 TypeError: Can't instantiate abstract class C with abstract methods x,但在 Python 2 中却没有。
【问题讨论】:
-
您可以在 utils 模块中将其定义为:
lambda f: property(abstractmethod(f))。 AFAICT 既没有six也没有future定义兼容性函数。请注意,虽然abstractproperty已被弃用,但当前所有 python 版本都支持它。我相信它可能会在几年后的python4.0中被删除。你真的需要你的库的当前版本在未来几年与未来版本的 python 兼容吗? -
它从 3.3 开始就被弃用了,现在我们有了 3.7,所以我认为是时候了……但如果它一直持续到 Python 4 就可以了。您建议的 lambda 解决方案在 Python 2 中不起作用(如果您忘记在
C中实现属性x,不会引发异常)
标签: python python-3.x python-2.7 abc