Emulating Final classes in Python

Steven D'Aprano steve+comp.lang.python at pearwood.info
Tue Jan 17 21:10:41 EST 2017


On Tuesday 17 January 2017 20:37, Antoon Pardon wrote:

> Op 17-01-17 om 08:05 schreef Steven D'Aprano:
>> I wish to emulate a "final" class using Python, similar to bool:
>>
>> py> class MyBool(bool):
>> ...     pass
>> ...
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> TypeError: type 'bool' is not an acceptable base type
[...]
> I find those kind of classes annoying as hell and nobody has ever given me a
> good reason for them. What good was it to change Lock from a factory function
> to a class if you can't subclass the result anyway.

I'm not sure which Lock class you're referring to.


> The result will probably be that users that would prefer to subclass your
> class will monkey-patch it. Something like:
> 
> class MyLock:
>     def __init__(self):
>         self.lock = Lock()
> 
>     def __getattr__(self, attr):
>         return getattr(self.lock, attr)

That technique is called "delegation", or sometimes "composition".


> So I wonder what reasons do you have prefering that your users monkey-patch
> your class instead of subclassing it?

Since my class provides no useful behaviour, I don't think anyone will 
seriously have any reason to subclass it.

Python has at least three singleton instances which are used purely as abstract 
symbols: they have no state, and very little behaviour besides a nice repr. 
They are None, NotImplemented and Ellipsis. I'm effectively trying to make my 
own abstract symbol.

But it's mostly a learning exercise.



-- 
Steven
"Ever since I learned about confirmation bias, I've been seeing 
it everywhere." - Jon Ronson




More information about the Python-list mailing list