En Tue, 20 Oct 2009 00:59:12 -0300, Mick Krippendorf <mad.m...@gmx.de> escribió:
Gabriel Genellina schrieb:

__special__ methods are searched in the type, not in the instance
directly. x*y looks for type(x).__mul__ (among other things)

So I thought too, but:

class meta(type):
    def __mul__(*args):
        return 123

class boo(object):
    __metaclass__ = meta

print boo.__mul__

b = boo()
print b * 7

also explodes. Or am I misinterpreting the word "type" here?

This is by design; see http://docs.python.org/reference/datamodel.html#special-method-lookup-for-new-style-classes

Methods defined on the meta-type aren't considered methods of the type; otherwise, every object would have the methods defined in `type` itself, because this is the metatype of every other object.

When I said "x*y looks for type(x).__mul__" the search for '__mul__' is done in type(x) itself, and all its base types along the MRO - NOT on the metatype, and not using getattr. There is no way to express this exact search in Python code (that I know of), but it's more or less like searching for '__mul__' in dir(type(x)).

In particular, __mul__ is stored in two slots (a slot is a field in a structure holding function pointers: nb_multiply in the tp_as_number structure, *and* sq_repeat in tp_as_sequence); defining or assigning to __mul__ "magically" updates those internal pointers. When executing x*y, __mul__ is retrieved directly from those pointers -- it is *not* searched by name.

In short, you have to define the __mul__ method on the type itself or any of its bases.

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to