withTemizlenmesi gereken kaynakları yönetmek için Python'un ifadesini kullanmanızı tavsiye ederim . Açık bir close()ifadeyi kullanmayla ilgili sorun, finallyherhangi 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 withaş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 withmaddeyi 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