SORU
14 Mayıs 2009, PERŞEMBE


Ne kadar doğru bir Python nesne temizleyebilir miyim?

class Package:
    def __init__(self):
        self.files = []

    # ...

    def __del__(self):
        for file in self.files:
            os.unlink(file)

__del__(self) yukarıda AttributeError bir istisna ile başarısız olur. Python doesn't guarantee varlığını anlıyorum "genel değişkenler" (bu bağlamda üye veri?) __del__() çağrıldığında. Bu durumda ve bu özel durum nedeni ise nesneye nasıl düzgün yok emin olabilirim?

CEVAP
14 Mayıs 2009, PERŞEMBE


Python temizlenmesi için gereken kaynakları yönetmek için 9* *deyimini kullanmanızı tavsiye ediyorum. Sorun ile kullanılarak açık close() deyim olduğunu düşünmek zorunda olduğum için insanlar unutmak için Ara hiç ya da unutmak için yeri içinde finally blok önlemek için bir kaynak sızıntısı olduğunda, bir özel durum oluşur.

with deyimi kullanmak için aşağıdaki yöntemleri ile bir sınıf oluşturun:

  def __enter__(self)
  def __exit__(self, exc_type, exc_value, traceback)

Yukarıdaki örnekte, kullanmak istiyorum

class Package:
    def __init__(self):
        self.files = []

    def __enter__(self):
        return self

    # ...

    def __exit__(self, exc_type, exc_value, traceback):
        for file in self.files:
            os.unlink(file)

Birini kullanmak için sınıf, aşağıdaki gibi yaparlar:

with Package() as package_obj:
    # use package_obj

Değişken package_obj türü Paket örneği (değer __enter__ yöntemi tarafından döndürülen) olacaktır. __exit__ onun metodu otomatik olarak çağrılır, ya da bir özel durum oluşur ne olursa olsun.

Bu yaklaşım bir adım öteye bile götürebilirsin. Yukarıdaki örnekte, birileri hala with maddesi kullanmadan kendi oluşturucu kullanarak oluşturmak Paketi olabilir. Bunun olmasını istemezsin. __enter__ __exit__ yöntemleri tanımlayan PackageResource bir sınıf oluşturarak bu sorunu ortadan kaldırabilirsiniz. Sonra, Paket sınıfı kesinlikle __enter__ yöntem içinde tanımlanan ve döndürülür. Bu şekilde, arayan kişi asla with ifadesi kullanmadan Paket sınıfı örneğini verebilir:

class PackageResource:
    def __enter__(self):
        class Package:
            ...
        self.package_obj = Package()
        return self.package_obj

    def __exit__(self, exc_type, exc_value, traceback):
        self.package_obj.cleanup()

Aşağıdaki gibi, bunu kullanmak istiyorum

with PackageResource() as package_obj:
    # use package_obj

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • EminemMusic

    EminemMusic

    9 ŞUBAT 2007
  • Ludique

    Ludique

    21 NİSAN 2009
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009