> On 10 Dec 2021, at 14:40, Steven D'Aprano <st...@pearwood.info> wrote: > > On Thu, Dec 09, 2021 at 05:19:00PM +0100, Ronald Oussoren wrote: > >> https://mail.python.org/pipermail/python-dev/2015-October/141953.html >> is an old thread about the difference between type(x)/Py_TYPE(x) and >> x.__class__ that contains some insight about this. > > Thanks for the link Ronald, I remember that thread. It didn't really > clarify things to me at the time, and re-reading it, it still doesn't.
That’s because the difference between the two is not clear, and it doesn’t help that C extensions (and CPython itself) use an API that always look at the object’s type slot and not at the ``__class__`` attribute (with APIs such as ``PyObject_TypeCheck`` and ``PyDict_Check``). > >> Proxy types are one use case, although with some sharp edges. > > I'm not looking for use cases. I'm looking for a better understanding of > how type() and isinstance() (and presumably issubclass) work. The best I > can see is that type() sometimes believes __class__ but not always, that > you can sometimes change __class__ but not always, but the rules that > control when and why (or why not) are not clear or documented, as far > as I can see. > > Is there a reference for how type(obj) and isinstance(obj, T) are > intended to work, or is the implementation the only reference? I’m not sure how much of this is documented to be honest. If the documentation is lacking there’s a change for someone to dig deep and help writing the documentation ;-) Changing the type of an instance by assigning to ``__class__`` is basically allowed when the C layout for instances of the two classes are compatible, the implementation contains the details about this. IIRC this requires that both classes inherit from a shared base class and none of the intermediate classes introduce new slots (or the C equivalent of this). Ronald > > Thanks in advance, > > > -- > Steve > _______________________________________________ > Python-Dev mailing list -- python-dev@python.org > To unsubscribe send an email to python-dev-le...@python.org > https://mail.python.org/mailman3/lists/python-dev.python.org/ > Message archived at > https://mail.python.org/archives/list/python-dev@python.org/message/GB2S2SMNDGS5UV5GG6O7HQUQSZP27OOI/ > Code of Conduct: http://python.org/psf/codeofconduct/ — Twitter / micro.blog: @ronaldoussoren Blog: https://blog.ronaldoussoren.net/
_______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/MIBOFO7CZM3TBKA5C3IRIHGB62MPCZFS/ Code of Conduct: http://python.org/psf/codeofconduct/