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
- ¿Por qué x2.m = 1000 no llama a la función __set__? Parece que esto sobrescribe la función. ¿Pero por qué?
- ¿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
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.