说我有以下代码:
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
会导致未解析的引用!
答案 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