Странное поведение при перегрузке __str__ или __repr__ - PullRequest
0 голосов
/ 26 июня 2019
class MyList:
    def __init__(self, start=[]):
        print('__init__ method')
        self.list = list(start)

if __name__ == '__main__':
    M = MyList([2,4,7,8,9,2,3,4])
    print(M.list)

В режиме отладки я получаю это.

enter image description here

Это верно.

Но когда я перегружаю str в Mylist (предыдущий код такой же)

    def __str__(self):
        return "__repr__ method: {0}".format(self.list)

Я получаю это

enter image description here

Если я заменю str на repr метод в классе ничего не меняет.

Но если я добавлю getattr и setattr

class MyList:
    def __init__(self, start=[]):
        print('__init__ method')
        self.list = list(start)

    def __repr__(self):
        return "__repr__ method: {0}".format(self.list)

    def __getattr__(self, item):
        print('__getattr__ method')
        return getattr(self.list, item)

    def __setattr__(self, key, value):
        print('__setattr__ method')
        if key == 'boolAttr':
            self.__dict__['boolAttr'] = False
        else:
            self.__dict__[key] = value

if __name__ == '__main__':
    M = MyList([2,4,7,8,9,2,3,4])
    print(M.list)

Python падает, и я получаю зацикленное сообщение "__getattr__ method "

После этого, если я удаляю str (или repr ) в Mylist, все верно.

Я не понимаю этогочто не так в str или repr методах в этой реализации

...