In unittest.mock.MagicMock I solve this problem by having __new__ create a new subclass for every instantiation. Setting any magic method on the instance is promoted to the type via __setattr__. That way every instance can have unique magic methods without affecting other instances.
Michael On Sun, 23 Feb 2020 at 04:21, Jérôme Carretero <cj-pyt...@zougloub.eu> wrote: > Thanks Josh for your prompt reply. All clear. > > > Regards, > > -- > Jérôme > > PS: Somehow I had never encountered a situation exacerbating the > subtleties of implicit invocations of special methods, and hadn't read > or integrated that section of the documentation, then when encountering > the “problem” I didn't make my way to the docs. > And now I also see that right when opening § 3.3. Special method > names ¶ 1 it's stated that “`x[i]` is roughly equivalent to > `type(x).__getitem__(x, i)`”. I'll be more careful next time! > > > On Sun, 23 Feb 2020 02:35:24 +0000 > Josh Rosenberg <shadowranger+pythonid...@gmail.com> wrote: > > > This is explained in "Special Method Lookup": > > https://docs.python.org/3/reference/datamodel.html#special-method-lookup > > > > Short version: For both correctness and performance, special methods > (those > > that begin and end with double underscores) are typically looked up on > the > > class, not the instance. If you want to override on a per-instance level, > > have a non-special method that __str__ invokes, that can be overridden > on a > > per-instance basis. > > > > On Sun, Feb 23, 2020 at 2:30 AM Jérôme Carretero <cj-pyt...@zougloub.eu> > > wrote: > > > > > Hello, > > > > > > > > > I just noticed that calling `str(x)` is actually doing (in CPython > > > `PyObject_Str`) `type(x).__str__(x)` rather than `x.__str__()`. > > > > > > Context: I wanted to override __str__ for certain objects in order to > > > “see them better”. > > > > > > I'm wondering why not do `x.__str__()` > > > > > > > > > Best regards, > > > > > > -- > > > Jérôme > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/G3MW5GD534GNYLE4ARZGE42NHGSSNLGL/ > Code of Conduct: http://python.org/psf/codeofconduct/ > -- Michael Foord Python Consultant, Contractor and Trainer https://agileabstractions.com/
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/7PS52WOQ3WM4N7NWEI3KSRAYETURWCRG/ Code of Conduct: http://python.org/psf/codeofconduct/