On Tue, Dec 31, 2013 at 8:35 AM, spir <denis.s...@gmail.com> wrote:
> Hello,
>
> I don't remember exactly how to do that. As an example:
>
> class Source (str):
>     __slots__ = ['i', 'n']
>     def __init__ (self, string):
>         self.i = 0                  # current matching index in source
>         self.n = len(string)        # number of ucodes (Unicode code points)
>         #~ str.__init__(self, string)
>
> I thought I needed to call str's __init__, as in the line comented out, but
> (1) python refuses with a TypeError (2) all seems to work fine (meaning, the
> string is well stored, *implicitely*). Am I missing some point, or is this
> the way to do? How does it work? I particular, how does python know which
> param to take as source string? (There could be other params to __init__.)

>>> class Source(str):
...     __slots__ = ['i', 'n']
...     def __init__(self, string):
...         self.i = 0
...         self.n = len(string)
...
>>> s = Source('testing')
>>> s
'testing'
>>> s.i
0
>>> s.n
7

If you look at the repr of str.__init__, you'll see that it is
inherited from object:

>>> str.__init__
<slot wrapper '__init__' of 'object' objects>
>>> str.__init__ is object.__init__
True

Compare this to the __init__ of list, which is a mutable type:

>>> list.__init__
<slot wrapper '__init__' of 'list' objects>
>>> list.__init__ is not object.__init__
True

Being immutable, str uses __new__ to create a new str object; it
doesn't use __init__ at all.  Since you're not overriding __new__ in
your subclass, you don't need to worry about calling str.__new__
because it's already done by the time Source.__init__ is called.

HTH,

-- 
Zach
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to