<table cellspacing="0" cellpadding="0" border="0" ><tr><td valign="top" style="font: inherit;"><div id="yiv322708761">I was coding a simple abstract class for a database interface for a library I am writing. However, it occurred to me that you can't ask for a simple "abstract attribute", an attribute that is required for the class. Now, that could be implemented as a property, but a getter that merely returns an attribute adds unnecessary code. Here's a simple pure-Python implementation:<br><pre><span class="k">class</span> <span class="nc">AbcAttrMeta</span><span class="p">:</span><br> <span class="nd">@classmethod</span><br> <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span><br> <span
class="n">inst</span> <span class="o">=</span> <span class="n">cls</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span><br> <span class="n">notin</span> <span class="o">=</span> <span class="nb">list</span><span class="p">()</span><br> <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__abattrs__</span><span class="p">:</span><br> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">inst</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span><br> <span class="bp">self</span><span class="o">.</span><span class="n">notin</span><span class="o">.</span><span class="n">append</span><span
class="p">(</span><span class="n">n</span><span class="p">)</span><br> <span class="k">if</span> <span class="n">notin</span><span class="p">:</span><br> <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><br> <span class="s">"Can't instantiate abstract class {0} with abstract attributes {1}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><br> <span class="nb">str</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">cls</span><span class="p">))[</span><span class="mi">5</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span><br> <span class="s">', '</span> <span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">notin</span><span class="p">))</span><br> <span
class="k">return</span> <span class="n">inst</span><br></pre><br></div></td></tr></table><br>