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? 
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to