On Tue, Jan 24, 2017 at 2:31 PM, This Wiederkehr <this.wiederk...@gmail.com> wrote: > Hellou > > having a class definition: > > class Test(): > > @classmethod > def __enter__(cls): > pass > > @classmethod > def __exit__(cls, exception_type, execption_value, callback): > pass > > now using this as a contextmanager does not work, even though Test is an > object and has the two required methods __enter__ and __exit__. > > it fails with: > #Attribute Error: __enter__ > > > This is not working because behind the scene it does something like: > type(Test).__enter__(Test) > > But isn't this supposed to be working? > > I am asking because I'd like to implement the clean up behaviour for > multiple instances directly into the class: > > with Test: > testinstance1 = Test() > testinstance2 = Test() > # on context exit Test.__exit__ should take care on cleaning up > testinstance1 and testinstance2.
Special dunder methods are generally only looked up on the object's class, not on the object itself. If you wish to use a class object as a context manager then you need to define __enter__ and __exit__ on the class's class, i.e. its metaclass. Alternatively you could separate the context manager from the testing class and make Test be just an object that defines __enter__, __exit__ and __call__, with __call__ creating and returning a new instance of the actual testing class. -- https://mail.python.org/mailman/listinfo/python-list