# Subclassing Python types

Posted 6 March 2009 in pythonI recently found a need to subclass the builtin type `unicode`

and add some additional properties. To instantiate I wanted to pass in a big, ugly object and get a unicode object back. After trying fruitlessly to override `__init__`

, I finally read up on the Python data model. Turns out I needed to override both `__new__`

**and** `__init__`

.

Here's a quick example:

```
class Equation(unicode):
def __new__(cls, i1, i2, i3):
eq = u"%(i1)s + %(i2)s = %(i3)s" % {'i1':i1, 'i2':i2, 'i3':i3}
return unicode.__new__(cls, eq)
def __init__(self, i1, i2, i3):
self.__is_valid = False
if i1 + i2 == i3:
self.__is_valid = True
@property
def is_valid(self):
return self.__is_valid
```

If I instantiate this with `equation = Equation(1, 2, 3)`

, `equation`

will act like a `unicode`

object with the value `u'1 + 2 = 3'`

, and `equation.is_valid`

will be `True`

. Similarly, `equation = Equation(2, 2, 5)`

will look like `u'2 + 2 = 5'`

, and `is_valid`

will be `False`

.

I doubt I'll forget this, but at least now I have it recorded somewhere.