Establecer una propiedad dentro de un método Python

Quiero establecer un atributo de solo lectura dentro de un método de clase.
Ya he intentado esto:

class Foo(object):
    def __init__(self, v):
        self._set('_v', v)

    def _set(self, attr, v):
        setattr(self, attr, v)
        setattr(Foo, attr[1:], property(lambda self: getattr(self, attr)))

pero es horrible. ¿Hay otra manera? Lo que necesito hacer es configurar la propiedad:

class Foo(object):
    def __init__(self, v):
        self._v = v

    @ property
    def v(self):
        return self._v    

>>> f = Foo(42)
>>> f.v
42
>>> f.v = 41
AttributeError: can't set attribute ## This is what I want: a read-only attribute

pero necesito hacerlo dentro de un método. ¿Hay otra manera

Gracias
rubik

PD. Ya he revisado esta publicación, pero no resuelve mi problema:Utilizando la propiedad Python () dentro de un método

EDIT: no puedo usarproperty, porque quiero configurarlo dentro de un método. Puedo usarproperty solo desde afuera:

class Foo(object):
    def __init__(self, v):
        self._v = v
    @ property
    def v(self):
        return self._v
    ## ...OR
    def getv(self):
        return self._v
    v = property(getv)

Y no puedo hacer eso porque no sé el nombre de la propiedad y tengo que configurarlo dinámicamente. Algo como esto

class Foo(object):
    def __init__(self, v):
        self._set_property_from_inside('v', v)
>>> f = Foo(42)
>>> f.v
42

Respuestas a la pregunta(4)

Su respuesta a la pregunta