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