Thank you for your answers. Very appreciated. I ended up doing it as follows:
class MetaLock(type): def __init__(cls, *args): super().__init__(*args) cls.lock = Lock() cls.instances = [] def register(cls, instance): cls.instances.append(instance) def __enter__(cls): cls.lock.acquire() def __exit__(cls, exc_type, exc_val, exc_tb): for instance in cls.instances: instance.cleanup() cls.instances = [] cls.lock.release() return False class Klass(metaclass=MetaLock): def __init__(self): if not self.__class__.lock.locked(): raise Exception("You have to use the context manager on the Class Object!") self.__class__.register(self) def cleaup(self): pass with Klass: inst1 = Klass() inst2 = Klass() # on leaving the context the cleanup of each instance of Klass is called. Regards This 2017-01-25 3:21 GMT+01:00 Terry Reedy <tjre...@udel.edu>: > On 1/24/2017 4:31 PM, This Wiederkehr wrote: > > 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? >> > > No. Unqualified 'method' means instance method, not class method. > > One can simulate instance methods like so: > > >>> import types > >>> def f(self): print('f called') > > >>> class C: pass > > >>> c = C() > >>> c.m = types.MethodType(f, c) > >>> c.m() > f called > > However, this will not work for dunder methods where the lookup for the > method starts with the class and not the object itself. > > >>> def h(self): return 1 > > >>> c.__hash__ = types.MethodType(h, c) > >>> hash(c) # calls type(c).__hash__, not c.__hash__ > -9223371924496369383 > > -- > Terry Jan Reedy > > -- > https://mail.python.org/mailman/listinfo/python-list > -- This Wiederkehr Vorgasse 21 5722 Gränichen 079 785 70 75 -- https://mail.python.org/mailman/listinfo/python-list