On 12/31/2013 04:03 PM, Zachary Ware wrote:
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.

Thank you, Oscar & Zachary. I guess thus the way it is done is correct (for my case), is it? Seems your last remark shows the source of my confusion: probably, in past times, I subtyped builtin types and overrided their __new__, thus had to call the original one. Would I have to do this if Source had other __init__ params? Or would it work anyway provided the string remains 1st param? Or what else?

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

Reply via email to