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.

pass

A metaclasse tem acesso ao nome da classe, às classes ancestrais de quem ela

herda e a todos os atributos de classe que forem definidos no corpo de class.

>>>

(<class '__main__.Meta'>,

'MyClass',

(<class 'object'>,),

{'__module__': '__main__',

'__qualname__': 'MyClass',

'foo': <function MyClass.foo at 0x102c7dd08>,

'stuff': 123})

O Python 2 possui uma sintaxe ligeiramente diferente e especifica uma

metaclasse usando o atributo de classe __metaclass__. A interface

Meta.__new__ é a mesma.

# Python 2

class Meta(type):

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

# ...

class MyClassInPython2(object):

__metaclass__ = Meta

# ...

Podemos adicionar funcionalidade ao método Meta.__new__ para validar todos

os parâmetros de uma classe antes que ela seja definida. Por exemplo, digamos

que se queira representar qualquer tipo de polígono com mais de três lados.

Podemos fazer isso definindo uma metaclasse especial de validação e usando-a

na classe base da hierarquia de classes do polígono. Observe que é importante

não aplicar a mesma validação para a classe-base.

class ValidatePolygon(type):

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

# Não valide a classe abstrata Polygon!

if bases != (object,):

if class_dict['sides'] < 3:

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!