<p><br>
On Thu, Mar 8, 2012 at 2:43 AM, Ethan Furman &lt;<a href="mailto:ethan@stoneleaf.us">ethan@stoneleaf.us</a>&gt; wrote:<br>
&gt;<br>
&gt; PJ Eby wrote:<br>
&gt;&gt;<br>
&gt;&gt; Short version: AddOns are things you can use to dynamically extend instances -- a bit like the &quot;decorator&quot; in &quot;decorator pattern&quot; (not to be confused with Python decorators).  Rather than synthesize a unique string as a dictionary key, I just used the AddOn classes themselves as keys.  This works fine for object instances, but gets hairy once classes come into play.<br>

&gt;<br>
&gt;<br>
&gt; Are you able to modify classes after class creation in Python 3? Without using a metaclass?<br></p>
<p>For ClassAddOns, it really doesn&#39;t matter; you can&#39;t remove them from the class they attach to.  Addons created after the class is finalized use a weakref dictionary to attach to their classes.</p>
<p>Now that I&#39;ve gone back and looked at the code, the only reason that ClassAddOns even use the class __dict__ in the first place is because it&#39;s a convenient place to put them while the class is being built.  With only slightly hairier code, I could use an __addons__ dict in the class namespace while it&#39;s being built, but there&#39;ll then be a performance hit at look up time to do cls.__dict__[&#39;__addons__&#39;][key] instead of cls.__dict__[key].</p>

<p>Actually, now that I&#39;m thinking about it, the non-modifiability of class dictionaries is actually a feature for this use case: if I make an __addons__ dict, that dict is mutable.  That means I&#39;ll have to move to string keys or have some sort of immutable dict type available...  ;-)  (Either that, or do some other, more complex refactoring.)</p>