metaclasses (was Re: Hooks, aspect-oriented programming, and design by contract)
Pedro Rodriguez
pedro_rodriguez at club-internet.fr
Sat Jan 26 07:58:29 EST 2002
[Apology if I am jumping on the subject, but while polishing a cleaner
version of an AOP prototype, some questions arised from similar topics]
"James_Althoff" <James_Althoff at i2.com> wrote:
> [Aahz Maruch]
>>Just to make sure I'm getting this straight, in the past James Althoff
>>has talked about Smalltalk's design, and IIRC, he said that in Smalltalk
>>it is *instances* of metaclasses that create classes. Can anyone
>>confirm or deny?
>
> Well, what I thought I had said (or meant to say, anyway <wink>) was
> that, in Smalltalk, classes *are* instances of metaclasses. Seen
> another way, metaclasses are simply classes whose instances happen to
> be, themselves, classes also. Regular classes -- those that are *not*
> metaclasses -- are not metaclasses solely by virtue of the fact that
> their instances are objects that are *not* classes.
A remark, there is an example from Alex Martelli in another thread that
shows that in current implementation (Python 2.2), you can use a callable
for a metaclass.
[OT : as a matter of fact, my AOP prototype doesn't use metaclasses (not
explicitly), but is centered around 'callable', I will have to consider
this asp... thing]
> In Python, you can consider type Type to be a "metatype" in the same
> way. "Instances" of type Type are themselves types. Instances of types
> other than type Type are objects that are *not* types. So only type
> Type is a "metatype" (talking pre-2.2, here). (Type Type is an
> "instance" of itself. In Smalltalk-76 -- before fullblown metaclasses
> were added in Smalltalk-80 -- class Class was an instance of itself,
> similarly.)
>
> Python 2.2's metaclasses are like Smalltalk's in this regard.
>
> Perhaps the confusion comes from this difference. In Smalltalk there
> are shortcuts such that if you create a class (using standard
> mechanisms) the system will first create a corresponding metaclass for
> you. Your newly created class is an instance of said newly created
> metaclass. The newly created metaclass is the place where you add class
> methods for your newly created class. In Smalltalk class methods are no
> different than instance methods. You simply invoke a method on a class
> object and that process is identical to invoking a method on any other
> kind of object. For example my_turtle.display() is a message to an
> instance (my_turtle) whereas Turtle.new() is a message to a class object
> (Turtle) (using Python syntax, here). Note: it so happens that in the
> standard Smalltalk library every class has a corresponding, separate
> metaclass. But this is a design choice and not a requirement of the
> language (IOW, Smalltalk allows multiple classes to be instances of a
> given metaclass).
>
>
>
So a class definition in ST, do :
M -> C, M'
where :
M is usually a predefined Metaclass
M' a new metaclass which is a subclass of M (?)
or which has M as a metaclass (?)
C the new class whose metaclass is M' (?)
or its metaclass is M, and M' is just a place holder (?)
> In Smalltalk metaclasses are useful because that is where you find class
> methods. In Python you can have "class methods" directly in class
> objects (by marking them as class methods) so the need to create a
> metaclass to change the behavior of a class is less common in Python
> than it is in Smalltalk.
>
>
>
It seems that metaclasses in Python are used to : - introduce methods to a
class that don't come with the user definition
(example : __init__ method in new style classes)
- control how a class and its instances can be altered
(example : 'setattr' won't work for on standard types or on instances
whose class define '__slots__')
- method resolution order
(example : difference between new classes and classical classes)
Regards,
--
Pedro
More information about the Python-list
mailing list