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.

def __init__(self, value):

self.__value = value

def get_value(self):

return str(self.__value)

foo = MyClass(5)

assert foo.get_value() == '5'

Essa não é a maneira correta de fazê-lo. Inevitavelmente alguém, incluindo você

mesmo, precisará criar uma subclasse desta classe para adicionar um novo

comportamento ou para contornar deficiências nos métodos existentes (como

mostrado no trecho de código anterior, MyClass.get_value sempre retorna uma

string). Escolher atributos privativos para isso torna desajeitadas e frágeis as

modificações propostas pela subclasse e extensões. Os usuários em potencial das

subclasses ainda conseguirão acessar os campos privativos quando eles

realmente precisarem fazê-lo.

class MyIntegerSubclass(MyClass):

def get_value(self):

return int(self._MyClass__value)

foo = MyIntegerSubclass(5)

assert foo.get_value() == 5

Porém, se a hierarquia de classes mudar nos níveis mais baixos, essas classes

deixarão de funcionar corretamente porque as referências privativas não são

mais válidas. No exemplo a seguir, o ancestral imediato (ou seja, a mãe) da

classe MyIntegerSubclass, chamada MyClass, tem uma nova classe-mãe

adicionada, chamada de MyBaseClass:

class MyBaseClass(object):

def __init__(self, value):

self.__value = value

# ...

class MyClass(MyBaseClass):

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!