example - getter en python
¿Cuáles son las diferencias entre los métodos “__get*__” y “_del*__” de Python? (1)
Acabo de comenzar a aprender Python hace unos meses y trato de entender las diferencias entre los diferentes métodos __get*__
:
__get__
__getattr__
__getattribute__
__getitem___
Y sus __del*__
equivalentes:
__del__
__delattr__
__delete__
__delitem__
¿Cuáles son las diferencias entre estos? ¿Cuándo debo usar uno sobre el otro? ¿Hay alguna razón específica por la cual la mayoría de los métodos __set*__
tienen __set*__
equivalentes, pero no hay __setattribute__
?
La documentación para cada método que usted enumera es fácilmente accesible desde el índice de documentación .
De todos modos esto puede ser una pequeña referencia extendida:
__get__
, __set__
y __del__
son descriptores
"En pocas palabras, un descriptor es una forma de personalizar lo que sucede cuando se hace referencia a un atributo en un modelo". [enlace doc oficial]
Están bien explicados, así que aquí hay algunas referencias:
- Descriptores de Python por Marty Alchin Parte 1 y Parte 2
- Por lo tanto, la pregunta Comprende los descriptores __get__ y __set__ y Python
__getattr__
, __getattribute__
, __setattr__
, __delattr__
Son métodos que se pueden definir para personalizar el significado de acceso a atributos (uso, asignación o eliminación de x.name
) para instancias de clase. [enlace doc oficial]
Ejemplo 1:
class Foo:
def __init__(self):
self.x = 10
def __getattr__(self, name):
return name
f = Foo()
f.x # -> 10
f.bar # -> ''bar''
Ejemplo 2:
class Foo:
def __init__(self):
self.x = 10
def __getattr__(self,name):
return name
def __getattribute__(self, name):
if name == ''bar'':
raise AttributeError
return ''getattribute''
f = Foo()
f.x # -> ''getattribute''
f.baz # -> ''getattribute''
f.bar # -> ''bar''
__getitem__
, __setitem__
, __delitem__
Son métodos que se pueden definir para implementar objetos contenedores. [enlace doc oficial]
Ejemplo:
class MyColors:
def __init__(self):
self._colors = {''yellow'': 1, ''red'': 2, ''blue'': 3}
def __getitem__(self, name):
return self._colors.get(name, 100)
colors = MyColors()
colors[''yellow''] # -> 1
colors[''brown''] # -> 100
Espero que esto sea suficiente para darles una idea general.