Respostas:
Os valores padrão do argumento são avaliados no tempo de definição da função, mas selfé um argumento disponível apenas no momento da chamada da função. Portanto, os argumentos da lista de argumentos não podem se referir.
É um padrão comum usar como padrão um argumento Nonee adicionar um teste para isso no código:
def p(self, b=None):
if b is None:
b = self.a
print b
Se você chegou aqui pelo google, verifique se você se deu como o primeiro parâmetro para uma função de classe. Especialmente se você tentar fazer referência a valores para esse objeto dentro da função.
def foo():
print(self.bar)
> NameError: o nome 'self' não está definido
def foo(self):
print(self.bar)