Вот почему оно так?
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-23 09:12 am (UTC)что-то1 = что-то2
и
список1 = список2
Не приводят к одинаковому по смыслу результату.
Связывание
Date: 2020-04-23 09:23 am (UTC)Re: Связывание
Date: 2020-04-23 11:41 am (UTC)Re: Связывание
Date: 2020-04-23 11:45 am (UTC):=
не больше присваивание, чем=
.no subject
Date: 2020-04-23 09:36 am (UTC)И для того, чтобы в этом убедиться, есть операция is.
В обоих случах две переменные становятся ссылками на один и тот же объект.
И если мы объект, на который указывает одна переменная, модифицируем, модифицируется и другой объект.
Правда, в случае списка модификация - штатная операция. а в случае числа - это извратиться надо.
Но зато тогда изменится не только то, что возвращают, переменные. но и то, на что указывает числоваая константа (причем с любой системой счисления).
И будет вот такая картина: