简体   繁体   中英

Python - recursion error when inherit from float and call str and repr

I was testing some features in Python for fun;) But I have a recursion error that I don't understand

class Test(float):
    def __new__(cls, value):
        return super().__new__(cls, value)

    def __str__(self):
        return super().__str__()
    
    def __repr__(self):
        return f'<value: {str(self)}>'


test = Test(12)
test

the return super().__str__() should call float.__str__() and just returns '12'

Do you have any ideas?

Your __repr__ calls your __str__ , which calls the super's __str__ , which defers to repr , which calls your __repr__ , which is an infinite recursion. You could call super().__repr__ in your __repr__ method, instead of calling str(self) .

class Test(float):
    def __new__(cls, value):
        return super().__new__(cls, value)

    def __str__(self):
        return super().__str__()
    
    def __repr__(self):
        return f'<value: {super().__repr__()}>'
>>> Test(12)
<value: 12.0>

The core issue is that float.__str__(self) will call self.__repr__() rather than float.__repr__(self) .

Not only does that mean that you have an infinite recursion from Test.__repr__ to Test.__str__ to float.__str__ back to Test.__repr__ , it means that Test.__str__ is going to print the same thing as Test.__repr__ , which I assume you don't want since you went to the effort of reimplementing it.

Instead I think you want:

class Test(float):
    def __str__(self):
        return super().__repr__()
    
    def __repr__(self):
        return f'<value: {super().__repr__()}>'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM