Python 3文档提到,abc.abstractproperty 自3.3版本起已被弃用,建议使用@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()
在Python 3中,以下代码会正确地引发TypeError: Can't instantiate abstract class C with abstract methods x
,但在Python 2中不会。
lambda f: property(abstractmethod(f))
。据我所知,six
和future
都没有定义兼容性函数。需要注意的是,虽然abstractproperty
已被弃用,但目前所有版本的Python都支持它。我认为在几年后的Python4.0可能会放弃它。你真的需要让当前版本的库与几年后的Python版本兼容吗? - Giacomo Alzetta