Python abc.abstractproperty兼容性

7

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中不会。


3
你可以在utils模块中这样定义:lambda f: property(abstractmethod(f))。据我所知,sixfuture都没有定义兼容性函数。需要注意的是,虽然abstractproperty已被弃用,但目前所有版本的Python都支持它。我认为在几年后的Python4.0可能会放弃它。你真的需要让当前版本的库与几年后的Python版本兼容吗? - Giacomo Alzetta
它自3.3版本起已被弃用,现在我们有了3.7,所以我认为是时候了...但如果它一直存在到Python 4,那也没关系。你建议的lambda解决方案在Python 2中不起作用(如果你忘记在“C”中实现属性“x”,它不会引发异常)。 - sfinkens
1个回答

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

我从问题的评论中借鉴了@Giacomo Alzetta的Python3解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接