Recentemente ho scoperto Python property
built-in, che nasconde i getter ei setter del metodo di classe come proprietà di una classe. Ora sono tentato di usarlo in modi che sono abbastanza sicuri sono inappropriati.Quando utilizzare la "proprietà" integrata: funzioni ausiliarie e generatori
Utilizzare la parola chiave property
è chiaramente la cosa giusta da fare se la classe A
ha una proprietà _x
di cui si desidera limitare i valori consentiti; cioè, sostituirebbe la costruzione getX()
e setX()
che si potrebbe scrivere in C++.
Ma dove altro è opportuno rendere una funzione una proprietà? Ad esempio, se si dispone di
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))
è opportuno aggiungere
vertex_positions = property(get_vertex_positions)
?
È mai ok per far sembrare un generatore una proprietà? Immagina se un cambiamento nel nostro codice significasse che non abbiamo più memorizzato Polygon.vertices
allo stesso modo. Sarebbe quindi ok aggiungere questo a Polygon
?
@property
def vertices(self):
for v in self._new_v_thing:
yield v.calculate_equivalent_vertex()