vitus_wagner: My photo 2005 (Default)
[personal profile] vitus_wagner
Имеем вот такой файлик:
# -*- 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, in 
    x()
TypeError: 'Callme' object is not callable


python3 call.py
foo
bar


Что я делаю не так?
Я, конечно могу обмануть питон, объявив
def __call__(self, *args):
     return self.action(*args)

а в конструкторе присваивать self.action. Но как-то оно странно. Всю жизнь думал что в питоне все логично, и если можно методы присваивать, то любые можно.

О, оказывается можно присвоить self.__class__.__caller__. Тогдавсе работает.
И меня в принципе устраивает. Поскольку тот объект, которому я хочу менять поведение при вызове в программе
в любом случае ровно один.

Date: 2020-04-22 08:19 pm (UTC)
From: [personal profile] kouzdra
Случайно не в том ли, что в первой ветке пропущен один подчерк?

Profile

vitus_wagner: My photo 2005 (Default)
vitus_wagner

June 2025

S M T W T F S
1 23 4 567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 6th, 2025 03:15 am
Powered by Dreamwidth Studios