Python抽象属性和继承

时间:2015-11-03 10:20:57

标签: python inheritance

说我有以下代码:

class Archive(object):
    """ Archiv-File wrapper """
    READ_MODE = 0
    WRITE_MODE = 1

    def __init__(self, file_):
        self.file_ = file_
        self._mode = None

    @property
    def mode(self):
        return self._mode

    @mode.setter
    def mode(self, value):
        self._mode = value

    def open(self, mode="r", pwd=None):
        raise NotImplemented("Subclasses should implement this method!")

    def close(self):
        raise NotImplemented("Subclasses should implement this method!")

################################################

class GzipGPGArchive(Archive):
    READ_MODE = 'r:gz'  # Open for reading with gzip compression.
    WRITE_MODE = 'w:gz'  # Open for gzip compressed writing.
    SUFFIX = "tar.gz.gpg"

    def __init__(self, *args, **kwargs):
        super(GzipGPGArchive, self).__init__(*args, **kwargs)

    @mode.setter # This causes unresolved reference
    def mode(self, value):
        # do internal changes
        self._mode = value

    def open(self):
        pass

    def close(self):
        pass

所以知道什么是覆盖Abstract类属性mode的setter和getter方法的最佳pythonic方法。

覆盖子类@mode.setter中的GzipGPGArchive会导致未解析的引用!

1 个答案:

答案 0 :(得分:3)

首先,Python中没有抽象属性。但是,您可以使用abc模块实现抽象。也许它不是真的" pythonic ",但它确实有效。

这是继承和抽象的最小示例。将其用作模板:

from abc import ABCMeta, abstractmethod

class Mother(metaclass=ABCMeta):

    @abstractmethod
    def method_(self):
        pass

    @property
    @abstractmethod
    def property_(self):
        return -1

    @property_.setter
    @abstractmethod
    def property_(self, value):
        pass

class Daughter(Mother):

    def __init__(self):
        self.value_ = 0

    def method_(self):
        print(self.value_)

    @property
    def property_(self):
        return = self.value_

    @property_.setter
    def property_(self, value):
        self.value_ = value