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中正确引发。
答案 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解决方案。