在 Python 中处理抽象属性的最好、最 Pythonic 的方法是什么?如果我想实现一个混合了抽象属性和具体方法的基类,我可以像下面这样进行操作。
class BaseClass(object):
__metaclass__ = ABCMeta
@abstractmethod
def property1(self):
pass
@abstractmethod
def property2(self):
pass
@abstractmethod
def property3(self):
pass
@abstractmethod
def abstract_method(self):
pass
def concrete_method(self):
return self.property1 + self.property2
但是,当我去实现继承类时,我需要将每个属性实现为私有属性的 getter 方法。
class Klass(BaseClass):
def __init__(property1, property2, property3):
self.__property1 = property1
self.__property2 = property2
self.__property3 = property3
@property
def property1(self):
return self.__property1
@property
def property2(self):
return self.__property2
@property
def property3(self):
return self.__property3
这看起来既不必要又冗长,并且使代码比它需要的更加晦涩。
我不喜欢具体实现事物并在继承类未实现其自己的版本时提出
NotImplementedError
的想法。
有更好的方法吗?
您不需要将属性实现为属性。您所需要的只是让名称存在于类中。因此,使用常规属性,以下内容将起作用:
class Klass(BaseClass):
property1 = None
property2 = None
property3 = None
def __init__(self, property1, property2, property3):
self.property1 = property1
self.property2 = property2
self.property3 = property3
def abstract_method(self):
# implementation for the abstract method
abstractproperty
装饰器,最好记录您想要将这些名称用作简单值,而不是调用的方法:
class BaseClass(object):
__metaclass__ = ABCMeta
@abstractproperty
def property1(self):
pass
@abstractproperty
def property2(self):
pass
@abstractproperty
def property3(self):
pass
@abstractmethod
def abstract_method(self):
pass
def concrete_method(self):
return self.property1 + self.property2