On Wed, Apr 6, 2016 at 2:39 PM, Marko Rauhamaa <ma...@pacujo.net> wrote: > Ian Kelly <ian.g.ke...@gmail.com>: > >> On Wed, Apr 6, 2016 at 1:59 PM, Marko Rauhamaa <ma...@pacujo.net> wrote: >>> It seems to me CPython is being a bit too picky here. Why should it >>> care if the method is a class method or an object method? >> >> Because the purpose of a class is to define the behavior of its >> instances. A function stored in an object attribute technically isn't >> a method at all. It's just a function that happens to be stored in an >> object attribute, i.e. *data*. Why should the behavior of a >> SimpleNamespace change just because somebody decided they wanted to >> store something under the name "__iter__" (or worse, >> "__getattribute__")? >> >> Also, because not having to check the instance dict for the presence >> of dunder methods is faster. > > Not convinced. Probably just an oversight.
It's documented here: https://docs.python.org/3/reference/datamodel.html#special-method-lookup > For example, file-like objects have no such reservations: > > import sys > import types > import xml.dom.minidom > > filelike = types.SimpleNamespace() > def write(s): > for c in s: > sys.stdout.write("{{{}}}".format(c)) > filelike.write = write > filelike.close = lambda: None > doc = xml.dom.minidom.getDOMImplementation().createDocument( > None, "tag", None).writexml(filelike) > sys.stdout.write("\n") The minidom implementation is probably just calling filelike.write('blah'). That will succeed in calling either a method or a function-in-an-attribute. Note that the write function you defined in this example has no self argument. This points to the fact that it's not truly a method. -- https://mail.python.org/mailman/listinfo/python-list