擅长:python、mysql、java
<p>如果你真的想强制子类定义一个给定的属性,你可以使用元类。就我个人而言,我认为这可能是过度杀戮,不是很Python,但你可以这样做:</p>
<pre><code> class AbstractFooMeta(type):
def __call__(cls, *args, **kwargs):
"""Called when you call Foo(*args, **kwargs) """
obj = type.__call__(cls, *args, **kwargs)
obj.check_bar()
return obj
class AbstractFoo(object):
__metaclass__ = AbstractFooMeta
bar = None
def check_bar(self):
if self.bar is None:
raise NotImplementedError('Subclasses must define bar')
class GoodFoo(AbstractFoo):
def __init__(self):
self.bar = 3
class BadFoo(AbstractFoo):
def __init__(self):
pass
</code></pre>
<p>基本上,元类重新定义<code>__call__</code>,以确保在实例的init之后调用<code>check_bar</code>。</p>
<pre><code>GoodFoo() # ok
BadFoo () # yield NotImplementedError
</code></pre>