Metaobject Protocols

Transkrypt

Metaobject Protocols
Meta Object Protocol(s)
C++
• Obiekty i klasy żyją w różnych światach • Klasy zasadniczo, znikają w czasie kompilacji • Bardzo ograniczone możliwości introspekcji
(Runtime Type Identification)
(type traits) Java
• Klasy jako obiekty • Reflection API
The Art of Metaobject Protocol G. Kiczales, J. des Rivieres, D.G. Bobror The MIT Press 1991
Common Lisp Object System
CLOS Metaobject Protocol
Common Lisp
Metaclass
•
•
•
•
Klasy są obiektami Jakiej klasy? Metaklasy Możemy zmieniać "klasę klas obiektów" 5
Python
http://eli.thegreenplace.net/2011/08/14/python-­‐metaclasses-­‐by-­‐example/
6
Python
class MyClass(object):!
! def __init__(self, arg):!
! ! self.val_ = arg!
!
! def
val(self):!
! ! return val_!
MyClass = type.__new__(type,!
type('MyClass', (), !
! ! ! ! ! !
{'__init__'
'MyClass',
__init__,!
supers, classdict)!
! ! ! ! !
type.__init__(MyClass,
'val' 'MyClass',
: val})
supers, classdict)
class MyClass(object):!
! __metaclass__ = MetaClass!
! def __init__(self, arg):!
! ! self.val_ = arg!
!
! def
val(self):!
! ! return val_!
8
class Meta(type):!
def __new__(meta, classname, supers, classdict ):!
print ('Creating class ', classname, supers, classdict)!
return type.__new__(meta, classname, supers, classdict)!
!
def __init__(self, classname, supers, classdict):!
print ('initializing class ', !
! ! ! ! ! classname, supers, classdict)!
type.__init__(self, classname, supers, classdict)
9
def inc(self):!
self.val_ = self.val_ + 1!
!
def dec(self):!
self.val_ = self.val_ - 1
class Meta(type):!
def __new__(meta, classname, supers, classdict ):!
print ('Creating class ', !
! ! ! ! ! classname, supers, classdict)!
classdict['inc']=inc!
return type.__new__(meta, !
! ! ! ! ! ! ! ! classname, supers, classdict)!
!
def __init__(self, classname, supers, classdict):!
print ('initializing class ', !
! ! ! ! ! classname, supers, classdict) !
self.dec=dec
!
type.__init__(self, classname, supers, classdict)
10
class Meta(type):!
def __new__(meta, classname, supers, classdict ):!
print ('Creating class ', classname, supers, classdict)!
classdict['inc']=inc!
return type.__new__(meta, classname, supers, classdict)!
!
def __init__(self, classname, supers, classdict):!
print ('initializing class ', !
! ! ! ! ! classname, supers, classdict) !
self.dec=dec
!
type.__init__(self, classname, supers, classdict) !
!
def __call__(cls, *args, **kwds):!
print 'Creating instance of ', !
! ! ! ! ! str(cls), str(*args), str(**kwds);!
return type.__call__(cls, *args, **kwds)
11
Ruby
class MyClass !
! def init!
! ! @val_ = 1 !
! end!
!
! def val !
! ! return
! end !
end!
!
!
obj1 = MyClass.new !
obj2 = MyClass.new
BasicObject
BasicObject
Object
Object
Module
MyClass -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐ val()
Class -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐ new()
obj1
obj2
• methods • instance_methods • object methods are instance methods of its class

Podobne dokumenty