I'm new to python, and I have a simple question.
say I make a subclass of str to change everything into 'test':
class Mystr(str):
    def __str__(self):
        return 'test'
    def __repr__(self):
        return 'test'
>>> mystr = Mystr(12345)
>>> print(mystr)
test
>>>
>>> print(mystr + 'test')
12345test
all I want is 'test', but where does python store the original value '12345' ? I can not find it anywhere.
>>> dir(mystr)
['__add__', '__class__', '__contains__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
after checking this, I actually find it in getnewargs
>>> mystr.__getnewargs__()
('12345',)
then I change this to :
class Mystr(str):
    def __str__(self):
        return 'test'
    def __repr__(self):
        return 'test'
    def __getnewargs__(self):
        return 'test'
>>> mystr = Mystr(12345)
>>> print(mystr)
test
>>> mystr.__getnewargs__()
'test'
>>> print(mystr + 'test')
12345test
why is 12345 still there? where does python store the original value '12345' ?
Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 18:41:36) [MSC v.1900 64 bit (AMD64)] on win32
It is stored in self. self is the object your method is attached to, that is, the string.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With