Có cách nào trong Python để viết một lớp sẽ lỗi trừ khi nó được sử dụng với câu lệnh with?Viết một lớp Python chỉ có thể được sử dụng như một trình quản lý ngữ cảnh
# Okay:
with Foo() as f1:
f1.func1()
f1.func2()
# Not okay:
f2 = Foo()
f2.func1()
Tôi có thể thực hiện thủ công: có __enter__
đặt cờ và có mọi phương pháp khác kiểm tra cờ đó. Nhưng có cách nào tốt hơn để làm điều đó?
Dưới đây là mã cho tương lai không-quá-từ cách:
class Foo(object):
def __init__(self):
self._entered = False
def __enter__(self):
self._entered = True
return self
def _verify_entered(self):
if not self._entered:
raise Exception("Didn't get call to __enter__")
def __exit__(self, typ, val, traceback):
self._verify_entered()
print("In __exit__")
def func1(self):
self._verify_entered()
# do stuff ...
def func2(self):
self._verify_entered()
# do other stuff
Bạn có cần 'foo()' để gây ra lỗi hoặc 'f2.func1()' có được không? – Blckknght
@Blckknght, có Foo() gây ra lỗi sẽ chỉ có thể thích hợp hơn để có f2.func1() làm điều đó – kuzzooroo
Bạn có thể sử dụng trang trí hoặc metaclass để áp dụng séc tự động thay vì theo cách thủ công. – agf