[Python-Dev] Classes and Metaclasses in Smalltalk (original) (raw)
Guido van Rossum guido@digicool.com
Wed, 02 May 2001 17:11:07 -0500
- Previous message: [Python-Dev] Classes and Metaclasses in Smalltalk
- Next message: [Python-Dev] Classes and Metaclasses in Smalltalk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
[From Jim Althoff] > In the list below, indentation indicates class hieararchy (superclass -- > subclass) The indentation, unfortunately, seems to be destroyed. [...] A question for Jim (this is more Smalltalk than Python related): How does the Behaviour class fit into this picture?
Jim responded with a much clearer diagram, and as a bonus an answer to your question about Behaviour!
Hi Guido,
Sorry about the mangled diagram. It's kind of tricky doing this with just text. :-) Anyway, below is a -- hopefully -- improved diagram and description. At the very bottom is an answer to the question about "Behavior". Jim ========================================== Smalltalk-80 (simplified) class/metaclass structure: Terminology: o A "class" is an object that can be instantiated. o A "metaclass" is a class and is one such that when it is instantiated that instance is itself a class (which can be instantiated). (A metaclass is a specialization of class). Essentially, there are two parallel hierarchies: 1) the class hierarchy and 2) the metaclass hierarchy. The class hierarchy starts with class Object. The metaclass hierarchy starts right below Class with the metaclass ObjectMetaClass. o Object o Class o MetaClass o ObjectMetaClass o ClassMetaClass o MetaClassMetaClass Object is the top of the class hierarchy (and total hierarchy). It has no superclass. It is the only class that has no superclass. Class is a subclass of Object. MetaClass is a subclass of Class. ObjectMetaClass is also a subclass of Class. ClassMetaClass is a subclass of ObjectMetaClass. MetaClassMetaClass is a subclass of ClassMetaClass. Adding in application classes Rectangle and SpamRectangle then might look like: o Object o Class o MetaClass o ObjectMetaClass o ClassMetaClass o MetaClassMetaClass o RectangleMetaClass o SpamRectangleMetaClass o Rectangle o SpamRectangle Rectangle is a subclass of Object. SpamRectangle is a subclass of Rectangle. RectangleMetaClass is a subclass of ObjectMetaClass. SpamRectangleMetaClass is a subclass of RectangleMetaClass. Rectangle is an instance of RectangleMetaClass. SpamRectangle is an instance of SpamRectangleMetaClass. (SpamRectangleMetaClass is an instance of MetaClass.) The next list shows both the subclass- and the instanceOf- relationships between classes and metaclasses. In this list a class listed below another class is a subclass of it. SpamMC is an abbreviation for SpamMetaClass (the metaclass of class Spam -- the class of which class Spam is an instance). Class Object instanceOf ObjectMC instanceOf MetaClass Class instanceOf ClassMC instanceOf MetaClass MetaClass instanceOf MetaClassMC instanceOf MetaClass ObjectMetaClass, ClassMetaClass, and MetaClassMetaClass are all instances of MetaClass. MetaClass is an instance of MetaClassMetaClass But MetaClassMetaClass is an instance of MetaClass. So this particular relationship is circular. (In Smalltalk-76, Class was an instance of itself.) Application classes would have a similar, parallel hierarchy between classes and their associated metaclasses. For example: Object instanceOf ObjectMC instanceOf MetaClass Rectangle instanceOf RectangleMC instanceOf MetaClass SpamRectangle instanceOf SpamRectangleMC instanceOf MetaClass When you create class SpamRectangle as a subclass of class Rectangle, the code in the class-creation method first creates the metaclass SpamRectangleMetaClass -- by instantiating MetaClass -- as a subclass of RectangleMetaClass. The code then creates the SpamRectangle class as an instance of the SpamRectangleMetaClass metaclass it just created. You can then create instances of class SpamRectangle. SpamRectangle "instance methods" reside in the method dict of SpamRectangle. SpamRectangle "class methods" reside in the method dict of SpamRectangleMetaClass. ============================ Regarding Thomas' question: The Smalltalk-80 class hierarchy actually has a bit more factoring than what I show above. In particular, Class and MetaClass are subclasses of the class ClassDescription. ClassDescription is a subclass of class Behavior. Behavior is a subclass of Object. So it looks like: o Object o Behavior o ClassDescription o MetaClass o Class o ObjectMetaClass o BehaviorMetaClass o ClassDescriptionMetaClass o MetaClassMetaClass o ClassMetaClass Class Behavior basically abstracts the creation and handling of method dict.s. Class ClassDescription factors out common, reusable code between MetaClass and Class. Clearly there are a number of ways of designing (or over-designing ) this part of the hierarchy. The key idea, though, was to use the subclassing mechanism as a way of supportig specialized class methods. =============================
--Guido van Rossum (home page: http://www.python.org/~guido/)
- Previous message: [Python-Dev] Classes and Metaclasses in Smalltalk
- Next message: [Python-Dev] Classes and Metaclasses in Smalltalk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]