I'm trying to understand descriptors and wrote a simple example that practically emulates the given one:
class Descriptor:
def __set_name__(self,obj,name):
self.name=name
def __set__(self,obj,valor):
if (self.name).title()=='Nombre':
if type(valor)!=str:
raise TypeError('No es un string')
else:
print(f'Estamos cambiando el atributo nombre de {obj} a {valor}')
setattr(obj,self.name,valor)
else: print('Hola')
def __get__(self,obj,owner):
return getattr(obj,self.name)
class Prueba:
nombre=Descriptor()
apellido=Descriptor()
print(nombre.__dict__)
print(apellido.__dict__)
def __init__(self,nombre,apellido):
self.nombre=nombre
self.apellido=apellido
baz=Prueba('foo','bar')
print(baz.__dict__)
Which makes the Jupyter Kernel crash (had never happened before).
If I change every nombre
or apellido
, I get:
{}
{}
Hola
Hola
{}
So somehow the instances of the Descriptor class are empty. Yet when I make Descriptor print self.name
in **set
**it works. I'm very confused about how to use them to simplify properties.