<div class="gmail_quote">On Tue, Jan 26, 2010 at 2:28 PM, Torsten Mohr <span dir="ltr"><<a href="mailto:tmohr@s.netic.de">tmohr@s.netic.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Is there a way to find out what i need to call?  I haven't found much in<br>
the documentation.  From writing C extensions i knew about the "new" entry<br>
in the PyTypeObject struct but it seems there's more behind it.<br>
In <a href="http://docs.python.org" target="_blank">docs.python.org</a> i did not find much, is there an URL where i can read<br>
more?<br></blockquote></div><br><a href="http://docs.python.org/reference/datamodel.html#basic-customization">http://docs.python.org/reference/datamodel.html#basic-customization</a> talks about __new__() and __init__().  The basic rule of thumb is that when you inherit from an immutable type, you need to override __new__, and when you inherit from a mutable type you need to override __init__.  I don't think that rule of thumb applies here, though, since an array.array is mutable. <br>
<br>The actual rule is that you need to override __new__ if the class you're inheriting from overrides __new__.  I don't think there's a straightforward way to know that ahead of time unless you look at the source code for the class.  Either that, or you just see that you get a TypeError when initializing your object and realize it means you need to override the constructor.<br>
<br>It would be nice if the TypeError was a little more explicit about what was going on, though.  Here's what I get in IDLE for a class similar to yours:<br><br>>>> import array<br>>>> class my_a(array.array):<br>
    def __init__(self, a, b):<br>        array.array.__init__(self, 'B')<br><br>>>> a = my_a(1, 2)<br><br>Traceback (most recent call last):<br>  File "<pyshell#6>", line 1, in <module><br>
    a = my_a(1, 2)<br>TypeError: array() argument 1 must be char, not int<br><br>It would be nice if the traceback mentioned something about array.__new__() instead of just array().<br><br>-- <br>Jerry<br>