Recientemente descubrí el property
built-in de Python, que disfraza getters y setters del método de clase como propiedad de una clase. Ahora estoy tentado de usarlo de maneras que estoy bastante seguro de que son inapropiadas.Cuándo utilizar la función "property" incorporada: funciones auxiliares y generadores
El uso de la palabra clave property
es claramente lo correcto si la clase A
tiene una propiedad _x
cuyos valores permitidos desea restringir; es decir, reemplazaría la construcción getX()
y setX()
que se podría escribir en C++.
¿Pero en qué otro caso es apropiado hacer de una función una propiedad? Por ejemplo, si usted tiene
class Vertex(object):
def __init__(self):
self.x = 0.0
self.y = 1.0
class Polygon(object):
def __init__(self, list_of_vertices):
self.vertices = list_of_vertices
def get_vertex_positions(self):
return zip(*((v.x,v.y) for v in self.vertices))
es conveniente añadir
vertex_positions = property(get_vertex_positions)
?
¿Alguna vez se puede hacer que un generador parezca una propiedad? Imagine si un cambio en nuestro código significa que ya no almacenamos Polygon.vertices
de la misma manera. ¿Estaría bien entonces agregar esto al Polygon
?
@property
def vertices(self):
for v in self._new_v_thing:
yield v.calculate_equivalent_vertex()