Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180

Механизм вызова методов

28.06.2018, 11:54. Показов 3905. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здраствуйте, коллеги.

Если взглянуть на синтаксис метода, можно трактовать его, как вызов __getattr__ с параметром имени метода и последующий вызов __call__. Для self в этой цепочке места нет.

В каком месте в этой цепочке появляется подстановка self, и можно ли как-то переопределить это поведение для своего класса?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.06.2018, 11:54
Ответы с готовыми решениями:

Порядок вызова конструкторов класса, субклассов и методов
Всем привет) Хочу попросить совета опытных товарищей. В целом, я не могу понять, как работает программа. В частности, не могу осознать...

Механизм вызова функции paintEvent (QPaintEvent *)
Всем привет! Кое-что не могу понять. При ООП с использованием библиотеки Qt, как я понимаю, конструктор - это некий аналог main()...

Механизм очереди методов
Здравствуйте. Возникла такая проблема, как видно из названия необходимо создать какой-то механизм для организации очереди...

4
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.06.2018, 13:10
Вызов метода это вызов функции с переменной self, являющейся контекстом класса.
Никакой связи с __call__ тут нет. Вы что-то перепутали с другими ЯП.
Функция сама по себе является callable - нафига ей call?
__call__ позволяет вызывать экземпляры пользовательских классов как будто это метод\функция.

Добавлено через 8 минут
Update.
Если вы про это
Python
1
2
def test(x):print(x)
test.__call__(10)
- то да, функция то сама по себе экземпляр встроенного класса function и никакой self тут не нужен, поскольку он уже прибинден интепретатором, когда мы создали определение функции.

Добавлено через 11 минут
И самое главное: type 'function' is not an acceptable base type
То есть унаследоваться от функции (types.FunctionType) как класса, чтобы что-то там переопределить мы не можем.
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
28.06.2018, 13:35  [ТС]
Не совсем. Меня интересует такой кейс:

Python
1
2
3
4
5
6
7
8
9
10
class MethodFunctor:
  def __call__(self, self2):
    pass
 
class Class:
  def __init__(self):
    mself.method = MethodFunctor()
 
obj = Class()
obj.method()
Данный код вызывает метод класса MethodFunctor, но не передает ему параметр self2.
Можно ли сделать так, чтобы с таким синтаксисом в качестве self2 передавался экземпляр Class?

Добавлено через 12 минут
А... Сообразил:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
#python 3.5.2
 
print ("Hello, world!")
 
class MethodFunctor:
  def __call__(self, self2, i):
    print(self, self2, i)
 
class Class:
  method = classmethod(MethodFunctor())
    
obj = Class()
obj.method(3)
Добавлено через 8 минут
И так тоже можно...

Python
1
2
3
4
5
6
7
8
9
10
11
12
#python 3.5.2
 
print ("Hello, world!")
 
class MethodFunctor:
  def __call__(self, self2, i):
    print(self, self2, i)
    
Class = type("Class", (), {"method": classmethod(MethodFunctor())})
    
obj = Class()
obj.method(3)
Ну и отлично. Ровно то, что я и хотел.
Спасибо

Добавлено через 3 минуты
Хм... Хотя нет... Это передается сам класс, но не объект ... А зачем?
0
757 / 306 / 190
Регистрация: 20.05.2016
Сообщений: 593
28.06.2018, 13:55
Лучший ответ Сообщение было отмечено Mirmik как решение

Решение

Всякая функция - дескриптор, у каждой есть метод __get__, который перехватывает обращение к функции как атрибуту класса (чере getattr, или точку). Этот метод биндит функцию к экземпляру нашего класса, возвращая экземпляр класса 'method' (PyMethod_Type), который содержит ссылку на self, и на саму функцию, разумеется.

При вызове method'а дескриптор classmethod подменяет ссылку на экземпляр класса (self) ссылкой на сам класс.

На сколько я понял Вы хотите, чтобы класс с методом __call__ вел себя в качестве метода как обычная функция. Тогда нужно пределить в вашем классе __get__
Python
1
2
3
4
5
6
7
8
9
10
11
import types
 
class MethodFunctor:
    def __call__(self, self2, i):
      print(self, self2, i)
 
    __get__(self, instance, cls):
        if instance is None:
            return self
        else:
            return types.MethodType(self, instance)
1
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
28.06.2018, 14:04  [ТС]
Да. Это то, что надо. Благодарствую.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2018, 14:04
Помогаю со студенческими работами здесь

Как работается механизм переопределения методов в наследниках?
Добрый день! Помогите разобраться. using System; namespace Test { class Program { static void Main(string...

Особенности вызова методов
Добрый день. Вообщем заметил такую особенность при вызове методов. Вот пример: class a{ public function am1(){ echo...

Перехват вызова методов
здравствуйте. собственно, могу ли я перехватить функцию которую вызвал мой метод который я вызвал рефлексией? например, в классе...

Цепочка вызова методов
Есть код: InputStream inp = Thread.currentThread().getContextClassLoader().getResourceAsStream("App.properties"); Непонятно, кто...

Используя механизм перегрузки методов, выполните задание согласно варианту:
Используя механизм перегрузки методов, выполните задание согласно варианту: Создайте методы, которые определяют сумму минимального...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru