Python abc.abstractproperty兼容性

sfi*_*ens 5 python abc python-2.7 python-3.x

Python 3文档提到从3.3开始不推荐使用abc.abstractproperty,而赞成@property@abstractmethod。是否有另一种方法来实现abc.abstractproperty与Python 2和3兼容的抽象属性(不带)?

我试过了

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()
Run Code Online (Sandbox Code Playgroud)

TypeError: Can't instantiate abstract class C with abstract methods x在Python 3中正确引发,但在Python 2中不正确。

小智 0

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

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
Run Code Online (Sandbox Code Playgroud)

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