Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

where does python store origin value for str

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

like image 934
ruby Avatar asked Nov 08 '22 17:11

ruby


1 Answers

It is stored in self. self is the object your method is attached to, that is, the string.

like image 75
kindall Avatar answered Nov 15 '22 11:11

kindall