Por qué Python usa atributos para definir privado
En lugar de utilizar atributos para privatizarlos, es conveniente llamar a métodos privados para privatizarlos. Consulte los detalles a continuación.
Al vincular atributos, si los atributos están directamente. expuesto, aunque escribir Es muy conveniente, pero no puede verificar los parámetros, lo que hace que la puntuación se pueda cambiar a voluntad: s?=?Student()
s.score?=?9999
Esto es obviamente ilógico. Para limitar el rango de puntuaciones, puede establecer la puntuación mediante el método set_score() y obtener la puntuación mediante el método get_score(), por lo que en el método set_score() puede comprobar el parámetro: ¿clase?Estudiante(objeto) :
def?get_score(self):
return?self._score
def?set_score(self,?value):
if?not ?isinstance(value,?int):
raise?ValueError('¡la puntuación? debe ser un número entero!')
if?value?lt;?0 ?o valor?gt; ?100:
¡aumentar?100! ')
self._score?=?value
Ahora, operar en una instancia de Estudiante arbitraria no le permitirá establecer la puntuación de forma arbitraria: gt;?s? =?Estudiante()
gt;gt;gt;?s.set_ score(60)?#?ok!
gt;gt;gt;?s.get_score()
60
gt;gt;gt;?s.set_score(9999)
¿Rastreo?(llamada.más.reciente?última): ...
ValueError: ¡la "puntuación" debe estar entre "0"~"100"!
Sin embargo, el método de llamada anterior es un poco complicado y no tan directo y simple como usar atributos.
¿Existe alguna forma de comprobar los parámetros y acceder a las variables de clase de forma sencilla, como las propiedades? Para los programadores perfeccionistas de Python, ¡esto es imprescindible!
¿Recuerdas que los decoradores pueden agregar dinámicamente funcionalidad a las funciones? Los decoradores también son eficaces para los métodos de clase. El decorador @property integrado en Python es responsable de convertir los métodos en llamadas de atributos:
class Student(object): @property
def?score( self ):
return?self._score
@score.setter
def?score(self, ?value):
if ?not?isinstance(value,?int):
raise?ValueError('¡la puntuación?debe ser un número entero!')
if?value?lt;?0?or ?value ?gt;?100:
raise?ValueError('score?debe estar entre ??~?100!')
self._score?=?value
La implementación de @property es complicada, así que primero veamos cómo usarla.
Convertir el método getter en una propiedad es tan simple como agregar @property. En este momento, @property crea otro decorador, @score.setter, que es responsable de convertir el método setter en una asignación de propiedad, por lo que tiene operaciones de propiedad controladas: gt; gt ;gt;?s?=?Student()
gt;gt;gt;?s.score?=?60?#?OK, esto en realidad se traduce como s.set_score(60)
p>gt;gt;gt;?s.score?#?OK, en realidad convertido a s.get_score()
60
gt;gt ;gt; ?s.score?=?9999
¿Rastreo?(¿la mayoría?
ValueError: ¡la "puntuación" debe estar entre "0"~"100"!
Al operar en propiedades de instancia, observe que la @property mágica le indicará que lo más probable es que la propiedad no esté expuesta directamente, sino que a través de métodos getter y setter
También se puede definir el modo de solo lectura. Los atributos, es decir, solo definir métodos getter sin definir métodos setter son atributos de solo lectura: class?Student (object):
@property
def?birth(self):
regresar? self._birth
@birth.setter
def?birth(self, ?value):
self._birth? =? valor
@property
def?age(self):
retorno?
El nacimiento anterior es de lectura y escritura. atributo, y la edad es un atributo de solo lectura porque la edad se puede calcular en función del nacimiento y la hora actual.
Resumen de una oración
El atributo @ se usa ampliamente en las definiciones de clases. permitiendo a las personas que llaman escribir códigos cortos al mismo tiempo. Asegúrese de realizar las comprobaciones necesarias en los parámetros para reducir la posibilidad de errores cuando se ejecuta el programa.