Вопрос Вопрос по python!?

Регистрация
4 Авг 2013
Сообщения
90
Репутация
0
Спасибо
0
Монет
0


class A:



def __init__(self, x):

self.x = x





def __call__(self, *args, **kwargs):

return self.x(*args, **kwargs).upper()





def freet(name):

return f'Привет, {name}'

freet = A(freet)



print(freet('Кемаль'))

Вопрос , запись freet = A(freet) означает что у класса A будет параметр? как это(код работает(
 
Всё я понял ошибку , там экземпляр просто имеется ввиду
 
В этом коде 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, в которой экз А. Такое тоже нигде больше нельзя делать. И хорошо, что нельзя, питон слишком много позволяет.
 
Назад
Сверху