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-23 09:12 am (UTC)
elentin: (Default)
From: [personal profile] elentin
Я в данном случае имею в виду, что кажущиеся похожими операции

что-то1 = что-то2

и

список1 = список2

Не приводят к одинаковому по смыслу результату.
Edited Date: 2020-04-23 09:13 am (UTC)

Связывание

Date: 2020-04-23 09:23 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
В Питоне нет операции присваивания!

Re: Связывание

Date: 2020-04-23 11:41 am (UTC)
pilpilon: (Default)
From: [personal profile] pilpilon
теперь есть. уже полгода как.

Re: Связывание

Date: 2020-04-23 11:45 am (UTC)
phd_ru: (Default)
From: [personal profile] phd_ru
:= не больше присваивание, чем =.

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 02:47 am
Powered by Dreamwidth Studios