Скажем, у меня есть следующий код: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
.
Переопределение @mode.setter
в подклассе GzipGPGArchive
вызывает нерешенную ссылку!
Вы можете инициализировать 'self._mode' в инициализаторе (' __init__'), в противном случае после создания экземпляра вы пытаетесь прочитать свойство (перед установкой его) вы будете получите 'AttributeError'. – CristiFati
@CristiFati исправила его, спасибо –