una programacion poo otra orientada objetos llamar funciona ejemplo dentro definir como clases clase atributos python attributes descriptor

programacion - python ejemplo clases



¿Por qué los atributos gestionados solo funcionan para atributos de clase y no para atributos de instancia en python? (3)

Para responder a su segunda pregunta, ¿dónde está _v ?

Su versión del descriptor mantiene _v en el descriptor en sí. Cada instancia del descriptor (la instancia de nivel de clase SomeClass1 y todas las instancias de nivel de objeto en los objetos de la clase SomeClass2 tendrán valores distintos de _v .

Mira esta versión. Esta versión actualiza el objeto asociado con el descriptor. Esto significa que el objeto ( SomeClass1 o x2 ) contendrá el atributo _v .

class MyDescriptor(object): def __get__(self, obj, type=None): print "get", self, obj, type return obj._v def __set__(self, obj, value): obj._v = value print "set", self, obj, value

Para ilustrar la pregunta, verifique el siguiente código:

class MyDescriptor(object): def __get__(self, obj, type=None): print "get", self, obj, type return self._v def __set__(self, obj, value): self._v = value print "set", self, obj, value return None class SomeClass1(object): m = MyDescriptor() class SomeClass2(object): def __init__(self): self.m = MyDescriptor() x1 = SomeClass1() x2 = SomeClass2() x1.m = 1000 # -> set <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> 10000 x2.m = 1000 # I guess that this overwrites the function. But why? # -> print x1.m # -> get <__main__.MyDescriptor object at 0xb787c7ec> <__main__.SomeClass1 object at 0xb787cc8c> <class ''__main__.SomeClass1''> 10000 print x2.m # -> 10000

  1. ¿Por qué x2.m = 1000 no llama a la función __set__? Parece que esto sobrescribe la función. ¿Pero por qué?
  2. ¿Dónde está _v en x1? No está en x1._v

Encontré _v de x1 : está en SomeClass1 .__ dict __ [''m''] ._ v

Para la versión sugerida por S.Lott dentro de la otra respuesta: _v está en x1._v


Deberías leer esto y esto .

Sobrescribe la función porque no sobrecargó las funciones __set__ y __get__ de SomeClass, sino de la clase MyDescriptor. ¿Quizás quisiste que SomeClass heredara MyDescriptor? SomeClass1 imprime los resultados "get" y "set" porque es un método estático AFAIK. Para detalles, lea los enlaces superiores.