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
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
Ne kadar Python bir nesne tarafından k...
Ne kadar sorunlu alanları belirlemek i...
Ne kadar doğru "bir" ve &quo...
Python:'doğru ve iyi bir şekilde ...
Nasıl Python bu uzun satırı kadar zara...