View Single Post
Eski 05/09/2007, 23:38   #2 (permalink)
myavuzselim
Eski Cevizci
 
myavuzselim Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 05/2004
Mesaj: 818
Varsayılan

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)
myavuzselim hatta değil   Alıntı Yaparak Yanıtla