Определение функции в методе не делает ее автоматически видимой для экземпляра - это просто функция, которая предназначена для использования в методе.
Чтобы разоблачить это, у вас возникнет соблазн сделать:
self.dynamically_defined_method = dynamically_defined_method
Только это не работает:
TypeError: dynamically_defined_method() takes exactly 1 argument (0 given)
Вы должны пометить функцию как метод (что мы делаем с помощью MethodType). Таким образом, полный код для этого выглядит следующим образом:
from types import MethodType
class TestClass(object):
def method(self):
def dynamically_defined_method(self):
print "two"
self.dynamically_defined_method = MethodType(dynamically_defined_method, self)
c = TestClass()
c.method()
c.dynamically_defined_method()