Subclassing in Python Redux(hynek.me)
hynek.me
Subclassing in Python Redux
https://hynek.me/articles/python-subclassing-redux/
11 comments
I’m not 100% sure (and on my phone) but I think the idiomatic way would be to subclass https://docs.python.org/3/library/collections.abc.html#colle...
and even then, it's a faff and a half: https://treyhunner.com/2019/04/why-you-shouldnt-inherit-from...
> The UserDict class initializer makes a dictionary which it stores in self.data. All of the methods on this dictionary-like UserDict class wrap around this self.data dictionary.
Incredible. This appears to be exactly the solution to my problem. Thanks! (And, if thunner happens to come across this: thanks, from a former TA of yours!)
Incredible. This appears to be exactly the solution to my problem. Thanks! (And, if thunner happens to come across this: thanks, from a former TA of yours!)
This is a great article. Many good thoughts on subtle design decisions that I think anyone writing Python should ponder from time to time.
Another great article in similar vein
https://eev.ee/blog/2013/03/03/the-controller-pattern-is-awf...
https://eev.ee/blog/2013/03/03/the-controller-pattern-is-awf...
"Code sharing is a bad idea."
What? He lost me there. While that fellow clearly knows a lot more about OOP than me, statements like that, which are not exactly self-evident and go against prior best practices ("don't repeat thyself") need to be justified, otherwise it just looks like just some other random dude's opinion piece.
What? He lost me there. While that fellow clearly knows a lot more about OOP than me, statements like that, which are not exactly self-evident and go against prior best practices ("don't repeat thyself") need to be justified, otherwise it just looks like just some other random dude's opinion piece.
I thought that from context it was clear that it means “Code sharing _via subclassing_ is a bad idea.” which the whole previous section tried to establish. I have clarified the sentence.
[deleted]
It's much clearer now, with your clarification. Thanks to you for the update, and to OP for the question.
I really wanted these instances to be indistinguishable from ordinary `dict` objects as far as interface goes, so it seemed like an optimal use-case for inheritance. But in hindsight it seems like the "composition over inheritance" principle is ushering me to stash k,v pairs in a dictionary attribute of an ordinary (non-subclassed) class object and simply define methods such as update, delete, __setitem__, etc., rather than inheriting them. I don't think that's unreasonable, but the bigger problem I see with that approach is has to do with type dispatching: what if a user of this class is checking whether an object is an instance of `dict` (or `typing.Mapping` for that matter)?