On Sun, 04 May 2014 11:21:53 +1200, Gregory Ewing wrote: > Steven D'Aprano wrote: >> I'm not entirely sure what he means by "upcalls", but I believe it >> means to call the method further up (that is, closer to the base) of >> the inheritance tree. > > I think it means this: > > def __new__(cls): > MyBaseClass.__new__(cls) > > which wouldn't work with a class method, because MyBaseClass.__new__ > would give a *bound* method rather than an unbound one.
If it were a class method, you would call it by MyBaseClass.__new__() rather than explicitly providing the cls argument. > Python 3's version of super() seems to work with class methods, but > Python 2's doesn't (or at least I couldn't get it to work in a brief > test). Works for me. Perhaps you got your super() call wrong? py> class MyDict(dict): ... @classmethod ... def fromkeys(cls, *args, **kwargs): ... print "Calling overridden method." ... return super(MyDict, cls).fromkeys(*args, **kwargs) ... py> MyDict.fromkeys('abc') Calling overridden method. {'a': None, 'c': None, 'b': None} py> MyDict().fromkeys('abc') Calling overridden method. {'a': None, 'c': None, 'b': None} > Also, I don't think super() existed at all when __new__ was > invented. Well, I don't know about that, but super was introduced in the same version as new-style classes with __new__. -- Steven D'Aprano http://import-that.dreamwidth.org/ -- https://mail.python.org/mailman/listinfo/python-list