 <p>The sort of thing you want to do could probably be done more easily using a class factory function like the following. At least for me, it makes it more straightforward to keep straight the various levels at which I'm trying to operate.</p> <pre><code>def listOf(base, types={}, **features): key = (base,) + tuple(features.items()) if key in types: return types[key] else: if not isinstance(base, type): raise TypeError("require element type, got '%s'" % base) class C(list): def __init__(self, iterable=[]): for item in iterable: try: # try to convert to desired type self.append(self._base(item)) except ValueError: raise TypeError("value '%s' not convertible to %s" % (item, self._base.__name__)) # similar methods to type-check other list mutations C.__name__ = "listOf(%s)" % base.__name__ C._base = base C.__dict__.update(features) types[key] = C return C </code></pre> <p>Note that I'm using a <code>dict</code> as a cache here so that you get the same class object for a given combination of element type and features. This makes <code>listOf(int) is listOf(int)</code> always <code>True</code>.</p>