exec para agregar una función en una clase

Así que he mirado preguntas similares y he encontrado algunas soluciones para esto, pero no puedo entender cómo hacerlo.

Lo que estoy tratando de hacer es agregar un método a una clase desde una cadena. Puedo hacer esto con elsetattr() Método, pero eso no me deja usar.self como atributo en el método extra. Aquí hay un ejemplo: (y me disculpo por los nombres de las variables, siempre uso yolo cuando me estoy burlando de una idea)

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()

devuelve esto:

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

y sis = 'def yolo():\n\tself.extra = "Hello"\n\tprint self.extra' entonces obtengo 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

Básicamente, esto significa que no puedo crear dinámicamente métodos para las clases, lo que sé que es una mala práctica y no es un tono, porque los métodos no podrían acceder a las variables a las que tiene acceso el resto de la clase.

Aprecio cualquier ayuda.

Respuestas a la pregunta(2)

Su respuesta a la pregunta