Python abc.abstractproperty兼容性

时间:2019-01-09 10:50:41

标签: python python-3.x python-2.7 abc

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中正确引发。

1 个答案:

答案 0 :(得分:0)

我知道这要求您导入ABC,但是为什么不尝试使用呢?

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解决方案。