Python abc.abstractproperty compatibility



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 中却没有。

我知道这需要您导入 ABC,但您为什么不使用 try 除非。

import abc
try:
    ABC = abc.ABC
    abstractproperty = lambda f: property(abc.abstractmethod(f))
except AttributeError:  # Python 2.7, abc exists, but not ABC
    ABC = abc.ABCMeta("ABC", (object,), {"__slots__": ()})
    from abc import abstractproperty

我在问题的评论中借用了 @Giacomo Alzetta 的 python3 解决方案。

最新更新