exec para adicionar uma função em uma classe

Então eu olhei para questões semelhantes, e eu encontrei algumas soluções para isso, mas eu não consigo descobrir como fazer isso.

O que estou tentando fazer é adicionar um método a uma classe de uma string. Eu posso fazer isso com osetattr() método, mas isso não me deixa usarself como um atributo no método extra. Aqui está um exemplo: (e peço desculpas pelos nomes das variáveis, eu sempre uso o yolo quando estou fazendo uma ideia)

class what:
    def __init__(self):
        s = 'def yolo(self):\n\tself.extra = "Hello"\n\tprint self.extra'
        exec(s)
        setattr(self,"yolo",yolo)

what().yolo()

retorna isso:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: yolo() takes exactly 1 argument (0 given)

e ses = 'def yolo():\n\tself.extra = "Hello"\n\tprint self.extra' então eu recebo este resultado:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 2, in yolo
NameError: global name 'self' is not defined

Isso significa essencialmente que não posso criar dinamicamente métodos para classes, o que sei que é uma prática incorreta e não-tipônica, porque os métodos não poderiam acessar as variáveis ​​às quais o restante da classe tem acesso.

Eu aprecio qualquer ajuda.

questionAnswers(2)

yourAnswerToTheQuestion