On Wednesday 17 June 2015 12:42, Dr. John Q. Hacker wrote: > On Tue, Jun 16, 2015 at 9:04 PM, Steven D'Aprano < > steve+comp.lang.pyt...@pearwood.info> wrote: > >> On Tue, 16 Jun 2015 19:24:03 -0500, Dr. John Q. Hacker wrote: >> >> > [Dr. Bigcock wrote:] >> >> The current syntax for adding functionality to a class using mix-in >> >> style via inheritance list conflates two very different things. >> >> I'm not sure why you are taking "Dr Bigcock" seriously. You know he isn't >> actually a doctor? >> > > Actually, I asked him. He said he was has a PhD in Theology.
You believe somebody calling himself "Dr Bigcock" (among other pseudonyms)? Just how much credibility does somebody calling themselves Bigcock get? Even in the "Carry On" movies they didn't use any names as unsubtle as that. https://www.youtube.com/watch?v=wcBOX1JBcjQ Besides, I have a Doctorate of Divinity, and I'm not a doctor either. >> > That's an awesome idea. It's like a final way to understand and >> > operate >> > > with metaclasses. >> > >> > Unfortunately, it has nothing to do with metaclasses. >> > > No, it *does*: it's operations on classes themselves (i.e. types) and > not > on *instantiations* of classes. If that isn't metaclassing, then python's > been calling it wrong. Python's definition of "metaclass" (the class of a class) is the same as that used by (at least) Objective C and Smalltalk. If you're going to argue that *Smalltalk* is wrong, well, good luck with that, Smalltalk invented the concept. http://www.cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html http://pharo.gforge.inria.fr/PBE1/PBE1ch14.html If you think there's another definition of "metaclass" in widespread use, please give some citations or links. What I will accept is that implementing class composition using the + operator *could* be implemented via the metaclass, at least in languages with metaclasses. But that's not the only way to do it. Java, for example, has no metaclasses (classes are not themselves objects in Java), but the Java language could easily define "Type + Type" as a way of composing types. It just wouldn't work via the metaclass. That's what I mean by "it has nothing to do with metaclasses" -- you can implement this without using metaclasses. >> I can see why: >> > >> > NewType = OldType + Mixin >> > >> > appears more attractive at first glance than: >> > >> > class NewType(OldType, Mixin): >> > pass >> > >> > since it saves a lot of boilerplate. But in practice, the body of the >> > class is not often "pass". More often, you end up overriding or adding >> > new methods. In that case, the suggested syntax has no advantage. >> > > Adding new methods is exactly what this syntax is supposed to do. No, it creates a new class which inherits *existing* methods belonging to the two composed classes, OldType and Mixin. It doesn't create any methods that don't already exist. > The tricky part is overriding existing methods. Precisely. If you want NewType.method to override either parent (OldType.method and/or Mixin.method) you need more than just a type composition operator. In Python you would use a class statement: class NewType(OldType + Mixin): def method(self): ... You would also do the same to add a new method not provided by either OldType or the Mixin. -- Steve -- https://mail.python.org/mailman/listinfo/python-list