Propiedad de Python que devuelve el objeto de propiedad

Tengo una clase como esta:

class Foo(object): def __init__(self): self.bar = property(self.get_bar) def get_bar(self): return "bar" print Foo().bar #this prints  

He visto ¿Cómo funcionan las propiedades de Python? , Cómo configurar una propiedad de python en __init__ , pero todas usan el método decorador, que no lo hago porque quiero un nombre diferente. Y necesito acceso a self

¿Cómo consigo que la propiedad se comporte?

Necesitas hacer un cambio menor:

 class Foo(object): def get_bar(self): return "bar" bar = property(get_bar) print Foo().bar # prints bar 

La propiedad debe ser un atributo de la clase, no la instancia; Así es como funciona el protocolo descriptor .

Puedes hacerlo asi

 class Foo(object): def __init__(self): self.__bar = None def get_bar(self): return self.__bar def set_bar(self, value): self.__bar = value bar = property(get_bar, set_bar) foo = Foo() print foo.bar # None foo.bar = 1 print foo.bar # 1 

También puedes hacerlo como se muestra aquí :

 class Foo(object): def __init__(self): self._bar = None @property def bar(self): return self._bar @bar.setter def bar(self, value): self._bar = value @bar.deleter def bar(self): self._bar = None # for instance 

que es equivalente a:

 class Also_Foo(object): def __init__(self): self._bar = None def get_bar(self): return self._bar def set_bar(self, value): self._bar = value def del_bar(self): self._bar = None # for instance bar = property(fget=get_bar, fset=set_bar, fdel=del_bar, doc=None) 

PERO sin contaminar el espacio de nombres de clase con los métodos de get y set para cada atributo.

Conserva el acceso directo externo a la variable utilizando ._bar lugar de .bar .

El objeto no está instanciado.

 class Foo(object): def get_bar(self): return "bar" bar = Foo() print(bar.get_bar)