2015-11-03 13 views
0

Скажем, у меня есть следующий код: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 вызывает нерешенную ссылку!

+0

Вы можете инициализировать 'self._mode' в инициализаторе (' __init__'), в противном случае после создания экземпляра вы пытаетесь прочитать свойство (перед установкой его) вы будете получите 'AttributeError'. – CristiFati

+0

@CristiFati исправила его, спасибо –

ответ

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 
+0

это сработало для меня, НО что на самом деле правильное питоническое делать такие вещи ??? –

+0

Нет абстракции :) –

Смежные вопросы