Antoine Pitrou <pit...@free.fr> added the comment: I just took a quick look at Lib/abc.py and there's no way *I*'ll reimplement it in C :)
The only workable approach would be: 1. rename the current would-be ABCs (IOBase, RawIOBase, etc.) with a leading underscore (_IOBase, _RawIOBase, etc.) 2. call abc.ABCMeta() with the right arguments to create heap-types derived from those base types 3. call XXXIOBase.register() with each of the concrete classes (BufferedReader, etc.) to register them with the ABCs created in 2 That is, do something like the following: >>> IOBase = abc.ABCMeta("IOBase", (_io.IOBase,), {}) >>> RawIOBase = type("RawIOBase", (_io.RawIOBase, IOBase), {}) >>> RawIOBase.register(_io.FileIO) >>> TextIOBase = type("TextIOBase", (_io.TextIOBase, IOBase), {}) >>> TextIOBase.register(_io.TextIOWrapper) Which gives: >>> f = open('foobar', 'wb', buffering=0) >>> isinstance(f, RawIOBase) True >>> isinstance(f, IOBase) True >>> f = open('foobar', 'w') >>> isinstance(f, IOBase) True >>> isinstance(f, TextIOBase) True >>> isinstance(f, RawIOBase) False As you see, RawIOBase inherits both from IOBase (the ABC, for ABC-ness) and _RawIOBase (the concrete non-ABC implementation). Implementation classes like FileIO don't need to explicitly inherit the ABCs, only to register with them. Also, writing a Python implementation still inherits the close-on-destroy behaviour: >>> class S(RawIOBase): ... def close(self): ... print("closing") ... >>> s = S() >>> del s closing >>> Perhaps we could even do all this in Python in io.py? _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue4565> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com