'Rough approximation of how slots work'
class Member(object):
'Descriptor implementing slot lookup'
def __init__(self, i):
self.i = i
def __get__(self, obj, type=None):
return obj._slotvalues[self.i]
def __set__(self, obj, value):
obj._slotvalues[self.i] = value
class Type(type):
'Metaclass that detects and implements _slots_'
def __new__(self, name, bases, namespace):
slots = namespace.get('_slots_')
if slots:
for i, slot in enumerate(slots):
namespace[slot] = Member(i)
original_init = namespace.get('__init__')
def __init__(self, *args, **kwds):
'Create _slotvalues list and call the original __init__'
self._slotvalues = [None] * len(slots)
if original_init is not None:
original_init(self, *args, **kwds)
namespace['__init__'] = __init__
return type.__new__(self, name, bases, namespace)
class Object(object):
__metaclass__ = Type
class A(Object):
_slots_ = 'x', 'y'
a = A()
a.x = 10
print a.x, a.y