Python抽象属性和继承

2024-10-01 13:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有以下代码:

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

所以知道什么是重写抽象类属性mode的setter和getter方法的最佳python方法。在

重写子类GzipGPGArchive中的@mode.setter会导致未解析的引用!在


Tags: selfnonereadinitvaluemodedefclass
1条回答
网友
1楼 · 发布于 2024-10-01 13:32:19

首先,Python中没有抽象属性。但是,您可以通过使用abc模块来实现抽象。也许它并不是真正的“Python”,但它是有效的。在

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

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

相关问题 更多 >