| ########################################################################### |
| # |
| # Psyco class support module. |
| # Copyright (C) 2001-2002 Armin Rigo et.al. |
| |
| """Psyco class support module. |
| |
| 'psyco.classes.psyobj' is an alternate Psyco-optimized root for classes. |
| Any class inheriting from it or using the metaclass '__metaclass__' might |
| get optimized specifically for Psyco. It is equivalent to call |
| psyco.bind() on the class object after its creation. |
| |
| Importing everything from psyco.classes in a module will import the |
| '__metaclass__' name, so all classes defined after a |
| |
| from psyco.classes import * |
| |
| will automatically use the Psyco-optimized metaclass. |
| """ |
| ########################################################################### |
| |
| __all__ = ['psyobj', 'psymetaclass', '__metaclass__'] |
| |
| |
| from _psyco import compacttype |
| import core |
| from types import FunctionType |
| |
| class psymetaclass(compacttype): |
| "Psyco-optimized meta-class. Turns all methods into Psyco proxies." |
| |
| def __new__(cls, name, bases, dict): |
| bindlist = dict.get('__psyco__bind__') |
| if bindlist is None: |
| bindlist = [key for key, value in dict.items() |
| if isinstance(value, FunctionType)] |
| for attr in bindlist: |
| dict[attr] = core.proxy(dict[attr]) |
| return super(psymetaclass, cls).__new__(cls, name, bases, dict) |
| |
| psyobj = psymetaclass("psyobj", (), {}) |
| __metaclass__ = psymetaclass |