I’ve seen a few talks about “stop writing classes”. I think they have a point, but it is a little over-stated. All debates are bravery debates, so it is hard to say which problem is harder — but as a recovering class-writing-guiltoholic, let me admit this: I took this too far. I was avoiding classes when I shouldn’t have.
Classes are best kept small
It is true that classes are best kept small. Any “method” which is not really designed to be overridden is often best implemented as a function that accepts a “duck-type” (or a more formal interface).
This, of course, sometimes leads to…
If a class has only one public method, except __init__, it wants to be a function
Especially given function.partial, it is not needed to decide ahead of time which arguments are “static” and which are “dynamic”
Classes are useful as data packets
This is the usual counter-point to the first two anti-class sentiments: a class which is nothing more than a bunch of attributes (a good example is the TCP envelope: source IP/target IP/source port/target port) are useful. Sure, they could be passed around as dictionaries, but this does not make things better. Just use attrs — and it is often useful to write two more methods:
- Some variant of “serialize”, an instance method that returns some lower-level format (dictionary, string, etc.)
- Some variant of “deserialize”, a class method that takes the lower-level format above and returns a corresponding instance.
It is perfectly ok to write this class rather than shipping dictionaries around. If nothing else, error messages will be a lot nicer. Please do not feel guilty.