В этом коде 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.
Надо ООП изучать на Java. Там кристально чистый ООП.
То, что в питоне есть вот такие извращенные штучки - нигде больше нет.
Это означает, что ваш класс А принимает в качестве параметра ФУНКЦИЮ.
Но дальше вы делаете не очень хорошую магию питона - вы подменяете объявленную функцию freet переменной freet, в которой экз А. Такое тоже нигде больше нельзя делать. И хорошо, что нельзя, питон слишком много позволяет.