Last active
August 29, 2015 13:57
-
-
Save thesamovar/9559605 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import brian2 | |
# Modified from http://code.activestate.com/recipes/496741-object-proxying/ | |
class Proxy(object): | |
__slots__ = ["_obj", "__weakref__"] | |
def __init__(self, obj): | |
object.__setattr__(self, "_obj", obj) | |
# | |
# proxying (special cases) | |
# | |
def __getattribute__(self, name): | |
return getattr(object.__getattribute__(self, "_obj"), name) | |
def __delattr__(self, name): | |
delattr(object.__getattribute__(self, "_obj"), name) | |
def __setattr__(self, name, value): | |
setattr(object.__getattribute__(self, "_obj"), name, value) | |
def __nonzero__(self): | |
return bool(object.__getattribute__(self, "_obj")) | |
def __str__(self): | |
# Proxy._check(object.__getattribute__(self, "_obj")) | |
return str(object.__getattribute__(self, "_obj")) | |
def __repr__(self): | |
return repr(object.__getattribute__(self, "_obj")) | |
# | |
# factories | |
# | |
_special_names = [ | |
'__abs__', '__add__', '__and__', '__call__', '__cmp__', '__coerce__', | |
'__contains__', '__delitem__', '__delslice__', '__div__', '__divmod__', | |
'__eq__', '__float__', '__floordiv__', '__ge__', '__getitem__', | |
'__getslice__', '__gt__', '__hash__', '__hex__', '__iadd__', '__iand__', | |
'__idiv__', '__idivmod__', '__ifloordiv__', '__ilshift__', '__imod__', | |
'__imul__', '__int__', '__invert__', '__ior__', '__ipow__', '__irshift__', | |
'__isub__', '__iter__', '__itruediv__', '__ixor__', '__le__', '__len__', | |
'__long__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', | |
'__neg__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', | |
'__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', | |
'__repr__', '__reversed__', '__rfloorfiv__', '__rlshift__', '__rmod__', | |
'__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', | |
'__rtruediv__', '__rxor__', '__setitem__', '__setslice__', '__sub__', | |
'__truediv__', '__xor__', 'next', | |
] | |
@classmethod | |
def _create_class_proxy(cls, theclass): | |
"""creates a proxy for the given class""" | |
def make_method(name): | |
def method(self, *args, **kw): | |
return getattr(object.__getattribute__(self, "_obj"), name)(*args, **kw) | |
return method | |
namespace = {} | |
for name in cls._special_names: | |
if hasattr(theclass, name): | |
namespace[name] = make_method(name) | |
return type("%s(%s)" % (cls.__name__, theclass.__name__), (cls,), namespace) | |
def __new__(cls, obj, *args, **kwargs): | |
""" | |
creates an proxy instance referencing `obj`. (obj, *args, **kwargs) are | |
passed to this class' __init__, so deriving classes can define an | |
__init__ method of their own. | |
note: _class_proxy_cache is unique per deriving class (each deriving | |
class must hold its own cache) | |
""" | |
try: | |
cache = cls.__dict__["_class_proxy_cache"] | |
except KeyError: | |
cls._class_proxy_cache = cache = {} | |
cls._instance_count = {} | |
try: | |
theclass = cache[obj.__class__] | |
except KeyError: | |
cache[obj.__class__] = theclass = cls._create_class_proxy(obj.__class__) | |
if id(obj) not in cls._instance_count: | |
cls._instance_count[id(obj)] = 0 | |
cls._instance_count[id(obj)] += 1 | |
ins = object.__new__(theclass) | |
theclass.__init__(ins, obj, *args, **kwargs) | |
return ins | |
def get_proxy_count(obj): | |
return Proxy._instance_count.get(id(obj), 0) | |
def display_active_objs(): | |
objs = brian2.NeuronGroup.__instances__() | |
for obj in objs: | |
obj = obj() | |
proxycount = get_proxy_count(obj) | |
# subtract 1 from refcount for refcount arg | |
# subtract 1 from refcount for refcount in this loop | |
refcount = sys.getrefcount(obj)-2 | |
if refcount==proxycount: | |
inc = 'EXCLUDE' | |
obj.active = False | |
else: | |
inc = 'INCLUDE' | |
print inc, obj.name, obj.active, proxycount, refcount | |
g = brian2.NeuronGroup(1, 'v:1', name='g') | |
g2 = brian2.NeuronGroup(1, 'w:1', name='g2') | |
h = Proxy(g) | |
h2 = Proxy(g2) | |
display_active_objs() | |
del g | |
display_active_objs() | |
print len(h) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment