Style Q: Instance variables defined outside of __init__
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Tue Mar 20 11:15:34 EDT 2018
On Tue, 20 Mar 2018 11:14:13 +0000, Alister via Python-list wrote:
> but why would a functional programmer be programming an OOP class?
I read a really good blog post a while back, which I sadly can no longer
find (I had it bookmarked until Firefox ate my bookmarks) that discussed
exactly that question.
What they came up with is that its really hard to do useful work for
large applications with 100% pure functional programming styles. As you
add functional techniques to your code, you find your code quality
increasing. Things like pure functions with no hidden state and no side
effects can have a massive positive effect on code quality -- up to a
point.
As you approach closer and closer to 100% pure functional code, you get
fewer improvements and your code gets harder to write and maintain.
(Think about things like dealing with user preferences, and having to
pass them around from function to function. Think about functions that
don't need a parameter themselves, but need to call a function that does.
Think about data processing without any mutable data structures.
Sometimes a modicum of state is exactly what we need.)
He maintains that the sweet spot is about 80% functional, and 20% OOP.
That seems to be about right to me: write classes with just the bare
minimum state you need, and have your methods work using a nearly-pure
functional style: they should take arguments, they should return results,
they should rarely operate by side-effects, etc.
Most of Python's design is like that. Apart from a few mutable data
structures, Python's built-ins tend to be immutable. We don't do things
like:
finder = SubstringFinder(start=1, end=55)
finder.set_string(string_to_search)
finder.set_target(substring)
position = finder.find()
rather we use the semi-functional style:
position = string_to_search.find(substring, start=1, end=55)
Don't be fooled by the dot method call syntax: that's exactly equivalent
to the purely functional style
find(string_to_search, substring, start=1, end=55)
--
Steve
More information about the Python-list
mailing list