You can't do it that way.
And that's a good thing - because the default is evaluated at function creation (ie, not when it's called). If it did happen to work, then the random number would have been generated when the program first loads this function, and then kept the same random number for every call afterwards.
This should give you the effect you want though;
def print_rand(self, num=None): if num is None: num = self.rand() # ...