[Tutor] MutableString/Class variables
Dave Angel
davea at davea.name
Thu May 9 16:26:21 CEST 2013
On 05/09/2013 09:16 AM, Albert-Jan Roskam wrote:
>
>
>> Subject: Re: [Tutor] MutableString/Class variables
>>
>> On 05/09/2013 08:10 AM, Albert-Jan Roskam wrote:
>>> Hello,
>>>
>>> I was just playing a bit with Python and I wanted to make a mutable string,
>> that supports item assignment. Is the way below the way to do this?
>>> The part I am not sure about is the class variable. Maybe I should also
>> have reimplemented __init__, then call super inside this and add an updated
>> version of "self" so __repr__ and __str__ return that. More general:
>> when should class variables be used? I am reading about Django nd there they are
>> all over the place, yet I have always had the impression their use is not that
>> common.
>>>
>>
>> You use a class attribute (not class variable) whenever you want to have
>> exactly one such value for the entire program. If you want to be able
>> to manipulate more than one, then you use an instance attribute,
>> typically inside the __init__() method.
>
> Hmmm, so is it fair to say that this is the OOP equivalent of 'nonlocal' in Python 3? It has meaning inside the entire scope of the class, not outside it, there not 'global'.
>
> Here's a modified version; in my previous attempts I messed up the arguments of super(). ;-) This feels better. But then again, I never *really* understood __new__ entirely.
>
> class MutableStr(str):
> def __init__(self, s):
> super(str, MutableStr).__init__(s)
> self.s = s
> def __repr__(self):
> return self.s
> def __str__(self):
> return self.s
> def __setitem__(self, key, item):
> self.s = self[:key] + item + self[key+1:]
>
> # produce results as intended
> mstr = MutableStr("01234X678")
> mstr[5] = "&"
> print str(mstr)
> print unicode(mstr)
> mstr = MutableStr("01234X678")
> mstr[8] = "&"
> print str(mstr)
> print unicode(mstr)
>
> # output:
> 01234&678
> 01234&678
> 01234X67&
> 01234X67&
>
>
>
That's all well and good as long as you only use those particular
methods. But try:
print "aaa" + mstr
#The changes you made to mstr have "vanished"
print(type(mstr))
mstr += "def"
print(mstr)
print(type(mstr))
#now it's no longer a MutablsStr
--
DaveA
More information about the Tutor
mailing list