В этом коде freet указывает на разные объекты, поэтому и непонятно. freet = A(freet) В конструктор класса A передаётся объект-функция freet, запоминается в аттрибуте x, созданный объект сохраняется в переменной freet. print(freet('Кемаль')) Переменная freet указывает на объект класса A, поэтому вызывается метод __call__ этого класса, которому передаются аргументы вызова (в данном случае одна строка). В методе __call__ запомненная в аттрибуте x объект-функция freet вызывается self.x(*args, **kwargs) с передачей параметров вызова (в данном случае одной строки), объект-функция freet возращает строку return f'Привет, {name}' к этой строке применяется метод upper, результат которого возвращается как результат вызова метода __call__, соответственно, он и выводится функцией print.