15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

# ...

class MyIntegerSubclass(MyClass):

def get_value(self):

return int(self._MyClass__value)

O atributo __value está associado agora à classe-mãe MyBaseClass, e não mais à

classe MyClass. Isso causa uma quebra na referência à variável privativa

self._MyClass__value na classe MyIntegerSubclass.

foo = MyIntegerSubclass(5)

foo.get_value()

>>>

AttributeError: 'MyIntegerSubclass' object has no attribute '_MyClass__value'

Na maioria das vezes, é melhor “errar para o lado certo” e permitir que as

subclasses façam mais coisas empregando atributos protegidos. Documente

muito bem cada campo protegido e explique quais são as APIs internas

disponíveis para subclasses e quais devem ser deixadas em paz. Isso tanto é um

alerta para outros programadores como orientação para você mesmo no futuro,

quando for estender seu próprio código.

class MyClass(object):

def __init__(self, value):

# O atributo abaixo armazena o valor informado pelo usuário

# para o objeto. Ele deve ser coercível para uma string. Uma

# vez atribuído ao objeto o valor deve ser tratado como imutável

self._value = value

O único momento em que devemos considerar seriamente usar atributos

privativos é quando estamos preocupados com conflitos de nomes entre as

subclasses. Esse problema ocorre quando uma classe-filha involuntariamente

define um atributo que já foi definido na classe-mãe.

class ApiClass(object):

def __init__(self):

self._value = 5

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!