Placing 'self' in the parameter list allows external procedures to be monkey-patched into a class, without needing to wrap it up in a 'partial'. For example:
def foo(self, x):
self.bar(x, 42)
class MyClass:
def bar(self, x, y):
print ("%s %s" % (x, y))
MyClass.foo = foo
While this is ugly, there are times when augmenting (or replacing) a class's existing methods is useful.