Python Language
Acceso de atributo
Buscar..
Sintaxis
-
x.title # Accesses the title attribute using the dot notation
-
x.title = "Hello World" # Sets the property of the title attribute using the dot notation
-
@property # Used as a decorator before the getter method for properties
-
@title.setter # Used as a decorator before the setter method for properties
Acceso a atributos básicos utilizando la notación de puntos
Tomemos una clase de muestra.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
book1 = Book(title="Right Ho, Jeeves", author="P.G. Wodehouse")
En Python, puede acceder al título del atributo de la clase usando la notación de puntos.
>>> book1.title
'P.G. Wodehouse'
Si un atributo no existe, Python lanza un error:
>>> book1.series
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Book' object has no attribute 'series'
Setters, Getters & Properties
Por el bien de la encapsulación de datos, a veces desea tener un atributo cuyo valor proviene de otros atributos o, en general, qué valor se computará en el momento. La forma estándar de lidiar con esta situación es crear un método, llamado getter o setter.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
En el ejemplo anterior, es fácil ver qué sucede si creamos un nuevo libro que contiene un título y un autor. Si todos los libros que vamos a agregar a nuestra biblioteca tienen autores y títulos, podemos omitir a los captadores y definidores y usar la notación de puntos. Sin embargo, supongamos que tenemos algunos libros que no tienen un autor y queremos que el autor sea "Desconocido". O si tienen varios autores y planeamos devolver una lista de autores.
En este caso, podemos crear un getter y un setter para el atributo de autor .
class P:
def __init__(self,title,author):
self.title = title
self.setAuthor(author)
def get_author(self):
return self.author
def set_author(self, author):
if not author:
self.author = "Unknown"
else:
self.author = author
Este esquema no es recomendable.
Una razón es que hay un problema: supongamos que hemos diseñado nuestra clase con el atributo público y sin métodos. La gente ya lo ha usado mucho y ha escrito un código como este:
>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = "" #Cos Some Guy didn't write this one!
Ahora tenemos un problema. ¡Porque el autor no es un atributo! Python ofrece una solución a este problema llamado propiedades. Un método para obtener propiedades está decorado con la propiedad @ antes de su encabezado. El método que queremos que funcione como configurador está decorado con @ attributeName.setter anterior.
Teniendo esto en cuenta, ahora tenemos nuestra nueva clase actualizada.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
@property
def author(self):
return self.__author
@author.setter
def author(self, author):
if not author:
self.author = "Unknown"
else:
self.author = author
Tenga en cuenta que normalmente Python no le permite tener varios métodos con el mismo nombre y diferente número de parámetros. Sin embargo, en este caso Python lo permite debido a los decoradores utilizados.
Si probamos el código:
>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = "" #Cos Some Guy didn't write this one!
>>> book.author
Unknown