擅长:python、mysql、java
<p>仅仅因为在抽象基类上将其定义为<code>abstractproperty</code>,并不意味着必须在子类上创建属性。</p>
<p>例如,您可以:</p>
<pre><code>In [1]: from abc import ABCMeta, abstractproperty
In [2]: class X(metaclass=ABCMeta):
...: @abstractproperty
...: def required(self):
...: raise NotImplementedError
...:
In [3]: class Y(X):
...: required = True
...:
In [4]: Y()
Out[4]: <__main__.Y at 0x10ae0d390>
</code></pre>
<p>如果要初始化<code>__init__</code>中的值,可以执行以下操作:</p>
<pre><code>In [5]: class Z(X):
...: required = None
...: def __init__(self, value):
...: self.required = value
...:
In [6]: Z(value=3)
Out[6]: <__main__.Z at 0x10ae15a20>
</code></pre>
<p>因为Python 3.3<code>abstractproperty</code>是<a href="https://docs.python.org/3/library/abc.html?highlight=abstractproperty#abc.abstractproperty" rel="nofollow noreferrer">deprecated</a>。因此,Python 3用户应该使用以下内容:</p>
<pre><code>from abc import ABCMeta, abstractmethod
class X(metaclass=ABCMeta):
@property
@abstractmethod
def required(self):
raise NotImplementedError
</code></pre>