15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

KeyError: 'Point3D'

Mesmo que escolhamos criar uma subclasse de BetterSerializable, não

obteremos todos os seus recursos se nos esquecermos de chamar register_class

depois do corpo do comando class. Essa técnica atrai muitos erros e pode ser um

tanto incompreensível para os programadores novatos. A mesma omissão pode

acontecer com os decoradores de classe no Python 3.

E se conseguíssemos agir em nome do programador, quando ele usa nossa classe

BetterSerializable, e garantirmos que register_class seja chamada em qualquer

caso? As metaclasses podem implementar esse comportamento ao interceptar os

comandos class no momento em que as subclasses estão sendo definidas

(consulte o Item 33: “Valide subclasses com metaclasses”) e permitem o registro

do novo ripo imediatamente após o corpo da classe.

class Meta(type):

def __new__(meta, name, bases, class_dict):

cls = type.__new__(meta, name, bases, class_dict)

register_class(cls)

return cls

class RegisteredSerializable(BetterSerializable, metaclass=Meta):

pass

No momento em que definimos uma subclasse de RegisteredSerializable,

podemos ter certeza de que a chamada a register_class acontecerá em qualquer

caso e que deserialize sempre funcionará como esperado.

class Vector3D(RegisteredSerializable):

def __init__(self, x, y, z):

super().__init__(x, y, z)

self.x, self.y, self.z = x, y, z

v3 = Vector3D(10, -7, 3)

print('Before: ', v3)

data = v3.serialize()

print('Serialized:', data)

print('After: ', deserialize(data))

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!