Soyle birsey yazdim, belki isine yarayabilir:
Kod:
# not: yaratilan bir Kapatici nesnesine baska bir referans
# olmasin! Gerektiginde kopyasini alin. Mesela:
#
# x = Kapatici(kapanan)
#
# y = x # hatali!
# y = x.kopyala() # dogru
#
# func(x) # hatali!
# func(x.kopyala()) # dogru
#
# arr = [x, x] # hatali!
# arr = [x.kopyala(), x.kopyala()] # dogru
class Kapatici:
def __init__(self, kapanan, kopya_sayisi=None):
self.kapanan = kapanan
if kopya_sayisi != None:
self.kopya_sayisi = kopya_sayisi
else:
self.kopya_sayisi = [1]
def kopyala(self):
kopya = Kapatici(self.kapanan, self.kopya_sayisi)
self.kopya_sayisi[0] += 1
return kopya
def __del__(self):
self.kopya_sayisi[0] -= 1
if self.kopya_sayisi[0] == 0:
self.kapanan.close()
# deneme
class DB:
def __init__(self, isim):
self.isim = isim
print "%s: init" % self.isim
def close(self):
print "%s: kapandi" % self.isim
def birsey_yap(self):
print "%s: birsey_yap" % self.isim
def f(db_kapatici, bir_daha=False):
db_kapatici.kapanan.birsey_yap()
if bir_daha:
f(db_kapatici)
def dene():
x = Kapatici(DB("DB_1"))
y = Kapatici(DB("DB_2"))
xx = x.kopyala()
f(xx)
del x
# del xx
f(y, True)