在 Python 中实现抽象属性

问题描述 投票:0回答:1

在 Python 中处理抽象属性的最好、最 Pythonic 的方法是什么?如果我想实现一个混合了抽象属性和具体方法的基类,我可以像下面这样进行操作。

class BaseClass(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def property1(self):
        pass

    @abstractmethod
    def property2(self):
        pass

    @abstractmethod
    def property3(self):
        pass

    @abstractmethod
    def abstract_method(self):
        pass

    def concrete_method(self):
        return self.property1 + self.property2

但是,当我去实现继承类时,我需要将每个属性实现为私有属性的 getter 方法。

class Klass(BaseClass):
    def __init__(property1, property2, property3):
        self.__property1 = property1
        self.__property2 = property2
        self.__property3 = property3

    @property
    def property1(self):
        return self.__property1

    @property
    def property2(self):
        return self.__property2

    @property
    def property3(self):
        return self.__property3

这看起来既不必要又冗长,并且使代码比它需要的更加晦涩。

我不喜欢具体实现事物并在继承类未实现其自己的版本时提出

NotImplementedError
的想法。

有更好的方法吗?

python oop python-3.x
1个回答
3
投票

您不需要将属性实现为属性。您所需要的只是让名称存在于类中。因此,使用常规属性,以下内容将起作用:

class Klass(BaseClass):
    property1 = None
    property2 = None
    property3 = None

    def __init__(self, property1, property2, property3):
        self.property1 = property1
        self.property2 = property2
        self.property3 = property3

    def abstract_method(self):
        # implementation for the abstract method

请注意,有一个

abstractproperty
装饰器,最好记录您想要将这些名称用作简单值,而不是调用的方法:

class BaseClass(object):
    __metaclass__ = ABCMeta

    @abstractproperty
    def property1(self):
        pass

    @abstractproperty
    def property2(self):
        pass

    @abstractproperty
    def property3(self):
        pass

    @abstractmethod    
    def abstract_method(self):
        pass

    def concrete_method(self):
        return self.property1 + self.property2
© www.soinside.com 2019 - 2024. All rights reserved.