Python Класс, перегрузка оператора - PullRequest
0 голосов
/ 04 мая 2020

Недавно, попав в руки Python Понятия класса, я наткнулся на это наблюдение и не смог понять.

Когда я пытаюсь создать экземпляр из нижеприведенного класса в интерактивном режиме (Python консоль), я также получаю строку Finding __len__ в выводе.

class MyClass(object):
    counter = 0
    data = 'Class Variable'

    def __init__(self):
        self.counter += 1
        self.value = -1

    def __str__(self):
        return "Instance {} is the {} instance".format(self.__class__.__name__, self.counter)

    def __getattr__(self, item):
        print(f'Finding {item}')
        return self.__dict__.get(item, f'Attr {item} not available, {self.__dict__}')

    def __setattr__(self, key, value):
        if key not in self.__dict__:
            self.__dict__[key] = value

    def __delattr__(self, item):
        print(f'Deleting attr: {item}')
        if item in self.__dict__:
            del self.__dict__[item]
        else:
            print(f'Cannot find {item} in {self.__dict__}')

if __name__ == '__main__':
    inst = MyClass()
    print(inst.id)

Но при запуске его в качестве модуля верхнего уровня, эта дополнительная строка не добавляется в вывод.

Может кто-то помогите мне понять, почему вывод Finding __len__ будет отображаться в интерактивном режиме.

Ниже приведен интерактивный вывод,

import WS1
x = WS1.MyClass()
Finding __len__
x.name = 'Yathin'
Finding __len__
...