property example define and python getter-setter standard-library accessor

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
  • google

__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.