with
Temizlenmesi gereken kaynakları yönetmek için Python'un ifadesini kullanmanızı tavsiye ederim . Açık bir close()
ifadeyi kullanmayla ilgili sorun, finally
herhangi bir istisna olduğunda kaynak sızıntısını önlemek için onu hiç çağırmayı veya bir bloğa yerleştirmeyi unutmayı düşünen kişilerdir .
İfadeyi kullanmak için with
aşağıdaki yöntemlerle bir sınıf oluşturun:
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
Yukarıdaki örnekte şunu kullanırsınız:
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)
Sonra, birisi sınıfınızı kullanmak istediğinde aşağıdakileri yapar:
with Package() as package_obj:
# use package_obj
Package_obj değişkeni Package türünün bir örneği olacaktır ( __enter__
yöntem tarafından döndürülen değerdir ). Onun __exit__
yöntemi bağımsız olarak otomatik bir özel durum oluşur olup olmadığına, çağrılır.
Hatta bu yaklaşımı bir adım daha ileri götürebilirsiniz. Yukarıdaki örnekte, birisi yine de with
maddeyi kullanmadan paketini yapıcısını kullanarak başlatabilir . Bunun olmasını istemiyorsun. __enter__
Ve __exit__
yöntemlerini tanımlayan bir PackageResource sınıfı oluşturarak bunu düzeltebilirsiniz . Daha sonra Package sınıfı kesinlikle __enter__
yöntemin içinde tanımlanır ve döndürülür. Bu şekilde, arayan hiçbir zaman bir paket kullanmadan Package sınıfını başlatamaz with
:
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()
Bunu aşağıdaki gibi kullanırsınız:
with PackageResource() as package_obj:
# use package_obj