This had been unclear for me since I began Python: Why would I use this __init__ version:
class FooInst:
    def __init__(self, x=None):
        self.x = x
Over this version which uses class variables:
class FooCls:
    x = None
The second example obviously leads into much less code that seems easier to read to me. Also, there's little to no difference in everyday use:
inst = FooInst()
cls = FooCls()
print(inst.x, cls.x)  # None, None
inst.x = 1
cls.x = 1
print(inst.x, cls.x)  # 1, 1
So basically I they both have a default value of None and there's no difference between getting the value (obj.x in both cases). I can also set both variables to a value, and it'll work (since cls.x = 1 "replaces" the class variable's value by creating an instance variable).
I know that __init__ is used to create instance variables and class Foo: x = None creates class variables, but why? I find the way of creating class variables to work just fine with instance variables too, and it's much cleaner code!
EDIT: I would use __init__ though if the variable needs some custom behaviour, like this:
class Foo:
    def __init__(self, x=0):
        try:
            self.x = int(x)
        except ValueError as e:
            log_error(e)
            raise e
EDIT2: This question is more about immutable default values, and why should they be done in the __init__ (if they should?) rather than in the class's namespace, so it's not a duplicate to the marked question.
EDIT3: Also, I'm more like asking if there's any reason not to use class variables instead of instance variables; answers like "class variables are shared between all instances, instance variables aren't" don't answer my question, since (as shown below in my code examples) class variables work just as well.
 
    