Is it correct this way to inherit from a list?

Rick Johnson rantingrickjohnson at gmail.com
Sat Mar 2 12:46:36 EST 2013


On Saturday, March 2, 2013 11:02:14 AM UTC-6, gialloporpora wrote:

> I would like to inherit from the list native class. really
> I expected that was possible to use native list method
> without redefining them, for example the __repr__ method.
> 
> [...]
>
> class vector(list):
> 	def __init__(self, *args):
> 		self._list = list(args)
> 		self._index = 0

Here is where you go wrong. 

First of all why would you inherit from "list" and then create a new list as attribute, that seems a bit silly huh? If you want your custom list to "inherit" all the pre-defined methods of the python list type, then do so.

>>> class MyList(list):
	pass

>>> ml = MyList()
>>> dir(ml)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> ml
[]
>>> ml.append('cat')
>>> ml
['cat']
>>> ml.extend(range(5))
>>> ml
['cat', 0, 1, 2, 3, 4]
>>> ml.sort()
>>> ml
[0, 1, 2, 3, 4, 'cat']
>>> isinstance(ml, list)
True

Quacks like a list to me. In this case you did not need to call the superclass constructor explicitly; for example.

class MyList(list):
    def __init__(self):
        list.__init__(self)
        
...is really a waste of time because you will not have any options to pass to the super. 
    
>>> ml2 = MyList2()
>>> dir(ml2)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> ml2+[10,20,30]
[10, 20, 30]
>>> ml2
[]
>>> ml2.append('salt')
>>> ml2
['salt']
>>> isinstance(ml2, list)
True
            
If however you wanted to create a custom Tkinter widget, you would then need to pass the options from the derived class __init__ method into the superclass __init__ method, like this:
    
class MyButton(tk.Button):
    def __init__(self, master, **kw):
        tk.Button.__init__(self, master, **kw)

mb = MyButton(rootWindow, text='PushMe', command=helloButton)

What are you trying to achieve exactly? 



More information about the Python-list mailing list