document.open();document.writeln('<div onmouseover="document.getElementById(\'snipt-2591\').style.display = \'block\'; return false;" onmouseout="document.getElementById(\'snipt-2591\').style.display = \'none\'; return false;" style="position: relative;">');document.writeln('<div class="highlight"><pre style="-moz-border-radius: 5px; border-radius: 5px; -webkit-border-radius: 5px; margin: 0; display: block; font: 11px Monaco, monospace !important; padding: 15px; background-color: #1C1C1C; overflow: auto; color: #D0D0D0;"><span style="color: #6ab825; font-weight: normal">class</span> <span style="color: #447fcf; text-decoration: underline">CallSuper</span><span style="color: #d0d0d0">(</span><span style="color: #bbbbbb">Exception</span><span style="color: #d0d0d0">):</span> <span style="color: #6ab825; font-weight: normal">pass</span>');document.writeln('');document.writeln('');document.writeln('<span style="color: #6ab825; font-weight: normal">def</span> <span style="color: #447fcf">callsuper</span><span style="color: #d0d0d0">(method):</span>');document.writeln('    <span style="color: #ed9d13">&quot;&quot;&quot;</span>');document.writeln('<span style="color: #ed9d13">    Decorator for calling the super method automagically.</span>');document.writeln('<span style="color: #ed9d13">    </span>');document.writeln('<span style="color: #ed9d13">    In the submethod, if a ``CallSuper`` exception is raised at any point, then</span>');document.writeln('<span style="color: #ed9d13">    the wrapper will look up the class&#39;s MRO (method resolution order) for a</span>');document.writeln('<span style="color: #ed9d13">    method of the same name. If none is found, the exception is allowed to</span>');document.writeln('<span style="color: #ed9d13">    permeate. If one is found, it too is wrapped with the ``callsuper``</span>');document.writeln('<span style="color: #ed9d13">    decorator and called with the arguments passed to ``CallSuper.__init__()``.</span>');document.writeln('<span style="color: #ed9d13">    &quot;&quot;&quot;</span>');document.writeln('    <span style="color: #6ab825; font-weight: normal">def</span> <span style="color: #447fcf">callsuper_wrapper</span><span style="color: #d0d0d0">(</span><span style="color: #24909d">self</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">*args):</span>');document.writeln('        <span style="color: #6ab825; font-weight: normal">try</span><span style="color: #d0d0d0">:</span>');document.writeln('            <span style="color: #6ab825; font-weight: normal">return</span> <span style="color: #d0d0d0">method(</span><span style="color: #24909d">self</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">*args)</span>');document.writeln('        <span style="color: #6ab825; font-weight: normal">except</span> <span style="color: #d0d0d0">CallSuper,</span> <span style="color: #d0d0d0">exc:</span>');document.writeln('            <span style="color: #d0d0d0">supermethod,</span> <span style="color: #d0d0d0">name</span> <span style="color: #d0d0d0">=</span> <span style="color: #24909d">None</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">method.__name__</span>');document.writeln('            <span style="color: #6ab825; font-weight: normal">for</span> <span style="color: #d0d0d0">base</span> <span style="color: #6ab825; font-weight: normal">in</span> <span style="color: #24909d">self</span><span style="color: #d0d0d0">.__class__.mro()[</span><span style="color: #3677a9">1</span><span style="color: #d0d0d0">:]:</span>');document.writeln('                <span style="color: #6ab825; font-weight: normal">if</span> <span style="color: #d0d0d0">(</span><span style="color: #24909d">hasattr</span><span style="color: #d0d0d0">(base,</span> <span style="color: #d0d0d0">name)</span> <span style="color: #6ab825; font-weight: normal">and</span>');document.writeln('                    <span style="color: #24909d">hasattr</span><span style="color: #d0d0d0">(</span><span style="color: #24909d">getattr</span><span style="color: #d0d0d0">(base,</span> <span style="color: #d0d0d0">name),</span> <span style="color: #ed9d13">&#39;__call__&#39;</span><span style="color: #d0d0d0">)):</span>');document.writeln('                    <span style="color: #d0d0d0">supermethod</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0">callsuper(</span><span style="color: #24909d">getattr</span><span style="color: #d0d0d0">(base,</span> <span style="color: #d0d0d0">name))</span>');document.writeln('                    <span style="color: #6ab825; font-weight: normal">break</span>');document.writeln('            <span style="color: #6ab825; font-weight: normal">if</span> <span style="color: #6ab825; font-weight: normal">not</span> <span style="color: #d0d0d0">supermethod:</span>');document.writeln('                <span style="color: #6ab825; font-weight: normal">raise</span>');document.writeln('            <span style="color: #6ab825; font-weight: normal">return</span> <span style="color: #d0d0d0">supermethod(</span><span style="color: #24909d">self</span><span style="color: #d0d0d0">,</span> <span style="color: #d0d0d0">*exc.args)</span>');document.writeln('    <span style="color: #d0d0d0">callsuper_wrapper.__name__</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0">method.__name__</span>');document.writeln('    <span style="color: #d0d0d0">callsuper_wrapper.__doc__</span> <span style="color: #d0d0d0">=</span> <span style="color: #d0d0d0">method.__doc__</span>');document.writeln('    <span style="color: #6ab825; font-weight: normal">return</span> <span style="color: #d0d0d0">callsuper_wrapper</span>');document.writeln('');document.writeln('<span style="color: #999999; font-style: italic"># Test it out</span>');document.writeln('');document.writeln('<span style="color: #6ab825; font-weight: normal">global</span> <span style="color: #d0d0d0">COUNTER</span>');document.writeln('<span style="color: #d0d0d0">COUNTER</span> <span style="color: #d0d0d0">=</span> <span style="color: #3677a9">0</span>');document.writeln('');document.writeln('<span style="color: #6ab825; font-weight: normal">class</span> <span style="color: #447fcf; text-decoration: underline">SuperClass</span><span style="color: #d0d0d0">(</span><span style="color: #24909d">object</span><span style="color: #d0d0d0">):</span>');document.writeln('    ');document.writeln('    <span style="color: #6ab825; font-weight: normal">def</span> <span style="color: #447fcf">method</span><span style="color: #d0d0d0">(</span><span style="color: #24909d">self</span><span style="color: #d0d0d0">):</span>');document.writeln('        <span style="color: #6ab825; font-weight: normal">global</span> <span style="color: #d0d0d0">COUNTER</span>');document.writeln('        <span style="color: #d0d0d0">COUNTER</span> <span style="color: #d0d0d0">+=</span> <span style="color: #3677a9">1</span> <span style="color: #999999; font-style: italic"># Increment counter.</span>');document.writeln('');document.writeln('<span style="color: #6ab825; font-weight: normal">class</span> <span style="color: #447fcf; text-decoration: underline">SubClass</span><span style="color: #d0d0d0">(SuperClass):</span>');document.writeln('    ');document.writeln('    <span style="color: #ffa500">@callsuper</span>');document.writeln('    <span style="color: #6ab825; font-weight: normal">def</span> <span style="color: #447fcf">method</span><span style="color: #d0d0d0">(</span><span style="color: #24909d">self</span><span style="color: #d0d0d0">):</span>');document.writeln('        <span style="color: #6ab825; font-weight: normal">global</span> <span style="color: #d0d0d0">COUNTER</span>');document.writeln('        <span style="color: #d0d0d0">COUNTER</span> <span style="color: #d0d0d0">+=</span> <span style="color: #3677a9">1</span> <span style="color: #999999; font-style: italic"># Increment counter.</span>');document.writeln('        <span style="color: #6ab825; font-weight: normal">raise</span> <span style="color: #d0d0d0">CallSuper</span>');document.writeln('');document.writeln('<span style="color: #d0d0d0">SubClass().method()</span>');document.writeln('<span style="color: #6ab825; font-weight: normal">assert</span> <span style="color: #d0d0d0">COUNTER</span> <span style="color: #d0d0d0">==</span> <span style="color: #3677a9">2</span>');document.writeln('</pre></div>');document.writeln('');document.writeln('<div style="background-color: #111; color: #D0D0D0; float: right; padding: 5px 10px; -moz-border-radius-topleft: 5px; -webkit-border-top-left-radius: 5px; border-top-left-radius: 5px; -moz-border-radius-bottomright: 5px; -webkit-border-bottom-right-radius: 5px; border-bottom-right-radius: 5px; font: 11px Arial,Sans-Serif; display: none; position: absolute; bottom: 0; right: 0;" id="snipt-2591">code hosted by <a href="http://snipt.net/zvoase/decorator-to-call-the-super-method-automagically" style="color: #0084FF; text-decoration: none;">snipt.net</a></div>');document.writeln('</div>');document.close();