Вот почему оно так?
Apr. 22nd, 2020 11:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Имеем вот такой файлик:
Запускаем
Что я делаю не так?
Я, конечно могу обмануть питон, объявив
а в конструкторе присваивать self.action. Но как-то оно странно. Всю жизнь думал что в питоне все логично, и если можно методы присваивать, то любые можно.
О, оказывается можно присвоить self.__class__.__caller__. Тогдавсе работает.
И меня в принципе устраивает. Поскольку тот объект, которому я хочу менять поведение при вызове в программе
в любом случае ровно один.
# -*- encoding: utf-8 -*- from __future__ import print_function class Callme: def __init__(self, arg): if arg: self.__call__ = self.foo else: self.__call__ = self.bar def foo(self): print("foo") def bar(self): print("bar") x = Callme(True) x() y = Callme(False) y()
Запускаем
python3 call.py Traceback (most recent call last): File "caller.py", line 17, inx() TypeError: 'Callme' object is not callable
python3 call.py foo bar
Что я делаю не так?
Я, конечно могу обмануть питон, объявив
def __call__(self, *args): return self.action(*args)
а в конструкторе присваивать self.action. Но как-то оно странно. Всю жизнь думал что в питоне все логично, и если можно методы присваивать, то любые можно.
О, оказывается можно присвоить self.__class__.__caller__. Тогдавсе работает.
И меня в принципе устраивает. Поскольку тот объект, которому я хочу менять поведение при вызове в программе
в любом случае ровно один.
no subject
Date: 2020-04-22 08:19 pm (UTC)no subject
Date: 2020-04-22 08:22 pm (UTC)