Red de conocimiento informático - Problemas con los teléfonos móviles - Por qué Python usa atributos para definir privado

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.