Below I have a very simple example of what I’m trying to do. I want to be able to use HTMLDecorator with any other class. Ignore the fact it’s called decorator, it’s just a name.
import cgi class ClassX(object): pass # ... with own __repr__ class ClassY(object): pass # ... with own __repr__ inst_x=ClassX() inst_y=ClassY() inst_z=[ i*i for i in range(25) ] inst_b=True class HTMLDecorator(object): def html(self): # an 'enhanced' version of __repr__ return cgi.escape(self.__repr__()).join(('<H1>','</H1>')) print HTMLDecorator(inst_x).html() print HTMLDecorator(inst_y).html() wrapped_z = HTMLDecorator(inst_z) inst_z[0] += 70 wrapped_z[0] += 71 print wrapped_z.html() print HTMLDecorator(inst_b).html()
Output:
Traceback (most recent call last): File 'html.py', line 21, in print HTMLDecorator(inst_x).html() TypeError: default __new__ takes no parameters
Is what I’m trying to do possible? If so, what am I doing wrong?
Looks like you’re trying to set up some sort of proxy object scheme. That’s doable, and there are better solutions than your colleague’s, but first consider whether it would be easier to just patch in some extra methods. This won’t work for built-in classes like
bool, but it will for your user-defined classes:And here is the proxy version: