Thanks to the comments provided, I was able to fix my issue. The problem, as described by @Martijn Pieters, was coming from the fact that I was creating a closure for each function while disregarding the scope of 'arg', hence it was the iteration of the loop that was binding the value. By passing 'arg' as an argument, I can now pass my parameter in the inner scope of my closure:
def decorator(*args):
def wrapper(cls):
if not issubclass(cls, Screen):
raise ValueError("You can't apply this decorator "
"on this class.")
for arg in args:
def clicker(self, marg=arg):
return "Hey !" + marg
setattr(cls, arg, clicker)
return cls
return wrapper