Confusion con propiedades

Soy nuevo en el uso de propiedades, así que armé una prueba simple como se muestra a continuación. En mis pruebas, hice dos clases “Prueba1” y “Prueba2” donde cada una debe contener un valor. Estoy intentando usar una propiedad para controlar el acceso al atributo “val” pseudo-oculto. Esta prueba actual no restringe ninguna entrada o salida del atributo “val” ya que este progtwig solo fue pensado como una prueba de concepto. Las dos clases de prueba que se muestran a continuación producen los mismos resultados y se supone que representan los diferentes métodos para construir una propiedad. Los ejemplos de usos para las propiedades a las que me refiero se encuentran en los documentos de python aquí .

Según la documentación :

Si entonces c es una instancia de C, cx invocará al captador, cx = valor invocará al configurador y eliminará el eliminador.

donde C es su clase de prueba. Pensé que al establecer el valor de la forma en que lo haría cambiaría _val y dejaría a val como una propiedad. Sin embargo, me parece que mi método para acceder al establecedor de propiedades es reemplazar la propiedad con el entero 5 menos que esté equivocado. Espero que alguien pueda aclarar mi confusión.

 class Test1: def __init__(self): self._val = 0 def setVal(self,newVal): self._val = newVal val = property(lambda self: self._val, setVal, None, "Property for value") def __str__(self): return "Value: {}".format(self.val) class Test2: def __init__(self): self._val = 0 @property def val(self): return self._val @val.setter def setVal(self,newVal): self._val = newVal def __str__(self): return "Value: {}".format(self.val) def verify(a): print("\nCheck with {}".format(a.__class__.__name__)) print("Value check:",a.val) a.val = 5 print("Value after a.val = 5 is:",a.val) print("The actual value is:",a._val) def main(): verify(Test1()) verify(Test2()) if __name__ == '__main__': main() 

De la documentación :

property([fget[, fset[, fdel[, doc]]]])

Devuelve un atributo de propiedad para clases de nuevo estilo (clases que derivan de un objeto).

Los descriptores solo se invocan para nuevos objetos o clases de estilo. Estás usando clases de estilo antiguo. Se hereda de un object tipo base:

 class Test1(object): # your code class Test2(object): def __init__(self): self._val = 0 @property def val(self): return self._val @val.setter def val(self,newVal): # should be named as property self._val = newVal def __str__(self): return "Value: {}".format(self.val) 

Este trabajo bien:

 >>> verify(Test1()) Check with Test1 ('Value check:', 0) ('Value after a.val = 5 is:', 5) ('The actual value is:', 5) 

Lea más sobre la diferencia entre las clases de nuevo estilo y las clases clásicas .