Mailing List Archive

Re: Inheriting from str
On 2021-09-20, ast <ast@invalid> wrote:
> Hello
>
> class NewStr(str):
> def __init__(self, s):
> self.l = len(s)
>
> Normaly str is an immutable type so it can't be modified
> after creation with __new__
>
> But the previous code is working well
>
> obj = NewStr("qwerty")
> obj.l
> 6
>
> I don't understand why it's working ?

The string itself is immutable. If it's a subclass then it may have
attributes that are not immutable:

>>> s = 'hello'
>>> s.jam = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'jam'
>>> class foo(str): pass
...
>>> s = foo('hello')
>>> s.jam = 3
>>> s.jam
3

There's a lot of places in Python where you can break standard
assumptions with sufficiently evil or badly-written classes.
e.g.:

>>> class intt(int):
... def __add__(self, other):
... return int(self) + int(other) * 2
...
>>> a = intt(2)
>>> b = intt(3)
>>> a + b
8
>>> b + a
7

--
https://mail.python.org/mailman/listinfo/python-list