Gibt es in Python eine Möglichkeit, eine Klasse zu schreiben, die fehlerhaft ist, wenn sie nicht mit einer with-Anweisung verwendet wird?Schreiben einer Python-Klasse, die nur als Kontextmanager verwendet werden kann
# Okay:
with Foo() as f1:
f1.func1()
f1.func2()
# Not okay:
f2 = Foo()
f2.func1()
ich es manuell tun können: haben __enter__
ein Flag gesetzt und haben jede andere Methode Prüfung für diese Flagge. Aber gibt es einen schöneren Weg, es zu tun?
Hier Code für die nicht-so-da Art und Weise:
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
Benötigen Sie 'foo()', um den Fehler zu verursachen, oder wäre 'f2.func1()' OK? – Blckknght
@Blckknght, mit Foo() Ursache der Fehler wäre nur mäßig vorzuziehen zu haben f2.func1() do it – kuzzooroo
Sie könnten einen Dekorateur oder eine Metaklasse verwenden, um die Prüfungen automatisch statt manuell anzuwenden. – agf