<div dir="ltr">2013/1/4 Pietro Battiston <span dir="ltr"><<a href="mailto:me@pietrobattiston.it" target="_blank">me@pietrobattiston.it</a>></span><div><br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
ho da poco scoperto "classmethod", e mi stanno parecchio simpatico.</blockquote><div><br></div><div style>A me non tanto... non tanto classmethod, poverino, tanto quel retrogusto di 'sono sicuro di non avere ciccato il design' che un un uso massiccio di suddetta feature lascia in bocca. Un uso moderato e' perfettamente ok e risolve una serie di questioni importanti. Pero' quando ci si trova con troppi metodi di classe qualche domanda uno se la deve porre.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"> Ho<br>
però trovato un piccolo ostacolo riguardo all'ereditarietà.</blockquote><div><br></div><div style>Meglio! Meno ereditarieta', meno lavoro! ;)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Per i metodi<br>
"normali", posso fare il classico:<br>
<br>
class Base(object):<br>
def fai_qualcosa(self):<br>
...<br>
return result<br>
<br>
class Derivata(Base):<br>
def fai_qualcosa(self):<br>
primo_passo = Base.fai_qualcosa( self )<br>
...<br>
return result<br></blockquote><div><br></div><div style>"Basta" fra virgolette. Nel senso che c'e' un lungo dibattito fra Base.method e super(Derived, self).method.</div><div style>In teoria il modo "corretto" sarebbe l'ultimo: corretto in questo senso vuole dire che "per fare quella cosa li, Guido ha aggiunto quella feature nel linguaggio". Ci sono pareri autorevoli in favore del piu' blando Base.method(self). </div>
<div style><br></div><div style>Personalmente io uso quasi sempre super. Mi rompe meno se faccio refactoring. Ed e' piu' robusto se si fanno cose strambe con l'ereditarieta'.</div><div style><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Ma per i classmethod non trovo qualcosa di ugualmente comodo ed<br>
elegante, nel senso che<br>
<br>
class Base(object):<br>
@classmethod<br>
def fai_qualcosa(cls):<br>
...<br>
return result<br>
<br>
class Derivata(Base):<br>
@classmethod<br>
def fai_qualcosa(cls):<br>
primo_passo = Base.fai_qualcosa( cls )<br>
...<br>
return result<br>
<br>
<br>
chiaramente protesta ("Base.fai_qualcosa" prende un solo argomento, che<br>
è per l'appunto sempre "Base"). Quindi l'unica alternativa che mi viene<br>
in mente è dare a "fai_qualcosa" un argomento opzionale "cls_effettiva".<br>
C'è qualcosa di meglio che mi sfugge?<br></blockquote><div><br></div><div style>Beh, per come funzionano i descrittori mi sembra assolutamente inevitabile che "fai_qualcosa" sia un bound della classe.</div>
<div style><br></div><div style><div>In [146]: Base.foo</div><div>Out[146]: <bound method type.foo of <class '__main__.Base'>></div><div><br></div><div style>Viceversa, super "fa la cosa giusta", perche' e' "piu' sveglio".</div>
<div style><br></div><div style>Dalla doc di super:</div><div style><br></div><div style><div>super(type, type2) -> bound super object; requires issubclass(type2, type)</div><div>Typical use to call a cooperative superclass method:</div>
<div><br></div><div><div>class C(B):</div><div> def meth(self, arg):</div><div> super(C, self).meth(arg)</div></div><div><br></div><div style>Poi se interessa si puo' andare a vedere nel dettaglio che fa il buon super...</div>
</div></div></div><div><br></div>-- <br> .<br>..: -enrico</div></div></div>