2008-12-17 13 views
9

En Python se usan propiedades en lugar de los getters, setters de estilo Java. Por lo tanto, rara vez se ve obtener ... o establecer ... métodos en las interfaces públicas de las clases.¿Debo usar los prefijos get_/set_ en los nombres de métodos de Python?

Pero en los casos en que una propiedad no es apropiada, uno puede terminar con métodos que se comportan como getters o setters. Ahora mis preguntas: ¿Deberían estos nombres de métodos comenzar con get_/set_? ¿O es esta verosidad unpythonic ya que a menudo es obvio lo que significa (y todavía se puede usar la docstring para aclarar situaciones no obvias)?

Esto podría ser una cuestión de gusto personal, pero me interesaría saber qué opina la mayoría al respecto. ¿Qué preferirías como usuario de API?

Ejemplo: Supongamos que tenemos un objeto que representa varias ciudades. Uno podría tener un método get_city_by_postalcode(postalcode) o uno podría usar el nombre más corto city_by_postalcode. Tiendo hacia el más tarde.

+0

"los casos eran una propiedad no es apropiada" teniendo problemas con esto. Un ejemplo ayudaría. Las propiedades son tan útiles que es difícil imaginar un lugar donde serían inapropiadas. –

+0

@ S.Lott: ¿Qué tal el ejemplo que proporcioné? No es un getter en el sentido habitual, pero 'get' podría ser el verbo más adecuado. – nikow

Respuesta

2

Creo que más corto es mejor, por lo que tiendo a preferir el más tarde. Pero lo importante es ser consistente con su proyecto: no mezcle los dos métodos. Si salta al proyecto de otra persona, mantenga lo que los otros desarrolladores eligieron inicialmente.

1

Lo he visto hecho en ambos sentidos. Procedente de un fondo de Objective-C, generalmente hago foo()/set_foo() si no puedo usar una propiedad (aunque intento usar propiedades siempre que sea posible). Sin embargo, realmente no importa mucho, , siempre y cuando sea consistente.

(Por supuesto, en su ejemplo, yo no llame al método get_city_by_postalcode() en absoluto, probablemente iría con translate_postalcode o algo similar, que emplea un mejor verbo de acción en el nombre.)

+3

En realidad, creo que "get_city_by_postalcode" es más descriptivo que "translate_postalcode". –

5

Ganaste Nunca pierda la oportunidad de hacer que su propiedad se comporte como un getter/setter más tarde usando descriptors. Si desea cambiar una propiedad para que sea de solo lectura, también puede reemplazarla por un método getter con el mismo nombre que la propiedad y decorarlo con @property. Así que mi consejo es evitar getters/setters a menos que el proyecto en el que estás trabajando ya los use, porque siempre puedes cambiar de opinión más adelante y hacer propiedades de solo lectura, solo escritura o lo que sea sin modificar la interfaz de tu clase.

4

Si es utilizable como una propiedad (un valor para obtener o establecer, y no hay otros parámetros, por lo general lo hacen:

class Foo(object): 

    def _get_x(self): 
     pass 

    def _set_x(self, value): 
     pass 

    x = property(_get_x, _set_x) 

Si el captador/definidor es más complejo que eso, me gustaría utilizar get_x y set_x:

0

Si tengo que utilizar un captador/definidor, me gusta esta manera:

Suponga que tiene una variable de self._x Entonces x() devolverá el valor de self._x, y. setX (x) establecería el valor de self._x

Cuestiones relacionadas