You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
MexTest feb92564b2 Загрузил(а) файлы в '' 2 years ago
README.md Initial 2 years ago
task2.py Загрузил(а) файлы в '' 2 years ago

README.md

1. Implicit Int

Поймите, что класс это тоже объект:

class A:
    pass

print(id(A))
# 140199780173328

print(dir(A))
# ...

Декораторы также могут быть применены к классу. Как и в случае с функциями декоратор должен возвращать новый (или такой же) класс:

def replace_repr(cls):
    cls.__repr__ = lambda self: f"object of cls {cls.__name__}"
    return cls

@replace_repr
class A:
    pass

print(A())
# object of cls A

Напишите декоратор implicit_int. Если приписать его к классу, то при обращении к необъявленному полю экземпляра этого класса будет возвращаться значение 0, Вам поможет магически метод __getattr__.

@implicit_int
class A:
    pass
    
a = A()
print(a.e + 589)  # Вывод: 589

2. Timer

Напишите менеджер контекста, который позволит засекать время выполнения блока кода с помощью конструкции with и выводить это время на экран по выходу из блока.

Пример использования:

with Timer():
    do_some_long_stuff()

3. Logger

Напишите класс, которой ведет журнал, какие методы у него вызывались. То есть у объектов данного класса должна быть возможность вызвать любой метод с любыми аргументами, а потом можно вызвать специальный метод (удобно здесь использовать __str__), который выдаст строку-лог со всей информацией о вызовах и аргументах. Кроме того, должна быть возможность унаследоваться от данного класса, чтобы добавить логирование к любому классу. При этом функции, определенные в классе-наследнике, все равно должны выполняться.

Для простоты игнорируйте атрибуты методов (докстринги и т.п.)