On Sat, Aug 6, 2011 at 11:04, Chris Rebert <c...@rebertia.com> wrote: > On Sat, Aug 6, 2011 at 12:34 AM, Eli Bendersky <eli...@gmail.com> wrote: >> Consider this standard metaclass definition: >> >> class MyMetaclass(type): >> def __init__(cls, name, bases, dct): >> super(MyMetaclass, cls).__init__(name, bases, dct) >> # do meta-stuff >> >> class Foo(object): >> __metaclass__ = MyMetaclass >> >> The call "super(MyMetaclass, cls)" should returns the parent of >> MyMetaclass here. But the 'cls' passed into this __init__ is *not* >> MyMetaclass, but rather the created class - i.e. Foo. > > ...which is an instance of the first argument to super(), which is how > super is typically invoked. Remember: a class is an instance of its > metaclass. > > Perhaps if you rename `cls` to `self` and then re-read your snippet, > you'll have a flash of sudden understanding. Calling the parameter > `cls` is merely convention. > >> So how does >> "super" get to the parent of MyMetaclass using this information? The >> documentation of "super" says: >> >> If the second argument is a type, issubclass(type2, type) must be >> true (this is useful for classmethods). >> >> Yes, 'cls' is a type (it's "class Foo"), but no, it's not a subclass >> of MyMetaclass, so this doesn't help. > > The typical form of super(), mentioned earlier in the documentation, > is being used here: > > super(type, obj) -> bound super object; requires isinstance(obj, type) > > `type` here is the metaclass, `obj` here is the class. By definition, > a class is an *instance* of its metaclass, so the precondition is > satisfied.
Thanks, Chris. This clarifies things. Eli -- http://mail.python.org/mailman/listinfo/python-list