1 | ||
Editor: geon
Time: 2006/02/18 15:05:17 GMT+0 |
||
Note: |
changed: - Počet instancí objektu Ahoj, dá se nejak zjistit, kolik je aktivních instancí daného objektu a získat na ne reference? První příklad :: class MyClass: counter = 0 def __init__(self): MyClass.counter += 1 def __del__(self): MyClass.counter -= 1 print MyClass.counter c = MyClass() print MyClass.counter d = MyClass() print MyClass.counter c = MyClass() print MyClass.counter Druhý příklad :: class MojeTrida: inst=[] def __init__(self): self.__class__.inst.append(self) c=MojeTrida() c2=MojeTrida() c3=MojeTrida() Nevýhoda: instance se po zániku nebudou uvolňovat. Třetí příklad - slabé reference :: #!/usr/bin/python import weakref, gc class Counted: reflist = [] def __init__(self): Counted.reflist.append(weakref.ref(self)) def get_count(self): self.reflist = [x for x in self.reflist if x() != None] return len(self.reflist) get_count = classmethod(get_count) def get_instances(self): self.reflist = [x for x in self.reflist if x() != None] t = [x() for x in self.reflist] return [x for x in t if x != None] get_instances = classmethod(get_instances) a = Counted() print Counted.get_count() b = Counted() print Counted.get_count() b = Counted() print Counted.get_count() del b print Counted.get_count() print Counted.get_instances() del a print Counted.get_count() print Counted.get_instances() c = Counted() print gc.get_referrers(c) a = [c, Counted(), Counted()] print gc.get_referents(a) print gc.get_referrers(c) print Counted.get_instances()
Ahoj, dá se nejak zjistit, kolik je aktivních instancí daného objektu a získat na ne reference?
class MyClass: counter = 0 def __init__(self): MyClass.counter += 1 def __del__(self): MyClass.counter -= 1 print MyClass.counter c = MyClass() print MyClass.counter d = MyClass() print MyClass.counter c = MyClass() print MyClass.counter
class MojeTrida: inst=[] def __init__(self): self.__class__.inst.append(self) c=MojeTrida() c2=MojeTrida() c3=MojeTrida()
Nevýhoda: instance se po zániku nebudou uvolňovat.
#!/usr/bin/python import weakref, gc class Counted: reflist = [] def __init__(self): Counted.reflist.append(weakref.ref(self)) def get_count(self): self.reflist = [x for x in self.reflist if x() != None] return len(self.reflist) get_count = classmethod(get_count) def get_instances(self): self.reflist = [x for x in self.reflist if x() != None] t = [x() for x in self.reflist] return [x for x in t if x != None] get_instances = classmethod(get_instances) a = Counted() print Counted.get_count() b = Counted() print Counted.get_count() b = Counted() print Counted.get_count() del b print Counted.get_count() print Counted.get_instances() del a print Counted.get_count() print Counted.get_instances() c = Counted() print gc.get_referrers(c) a = [c, Counted(), Counted()] print gc.get_referents(a) print gc.get_referrers(c) print Counted.get_instances()