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.

atributo privativo é _MyParentObject__private_field. Acessar o atributo

privativo da classe-mãe a partir da classe-filha falha. O motivo, bastante simples,

é que o nome do atributo transformado não existe na outra classe.

Sabendo disso, o programador pode acessar facilmente os atributos privativos de

qualquer classe, tanto de uma classe como externamente, sem pedir permissão.

assert baz._MyParentObject__private_field == 71

Se olharmos no dicionário de atributos do objeto, veremos que os atributos

privativos são, na verdade, armazenados com os nomes da forma como

aparecem depois da transformação.

print(baz.__dict__)

>>>

{'_MyParentObject__private_field': 71}

Por que então a sintaxe para atributos privativos não assegura as restrições de

visibilidade como deveria? A resposta mais simples é um dos lemas mais citados

do Python: “Somos todos adultos aqui e consentimos em dar liberdade uns aos

outros” 1 . Os programadores de Python acreditam que os benefícios da liberdade

são maiores que as desvantagens de ter a cabeça fechada.

Além disso, ter a possibilidade de criar ganchos para recursos da linguagem

como o acesso a atributos (consulte o Item 32: “Use __getattr__,

__getattribute__ e __setattr__ para atributos preguiçosos”) permite que qualquer

um possa desfigurar bastante o funcionamento interno do objeto sempre que

desejar. Todavia, se isso é permitido, qual a vantagem de o Python tentar

bloquear o acesso a atributos privativos por outras vias?

Para minimizar os danos causados pelo acesso indevido às engrenagens internas

de uma classe, os programadores de Python seguem à risca uma convenção de

nomes definida no Guia de Estilo oficial (consulte o Item 2: “Siga o Guia de

Estilo PEP 8”). Campos prefixados com um único underscore (como

_protected_field) são protected, o que alerta os usuários externos à classe para

proceder com a devida cautela.

Entretanto, muitos programadores novatos em Python usam campos provativos

para indicar uma API interna que não deve ser acessada por subclasses ou

externamente.

class MyClass(object):

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!