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.

LRR = 7

Index 0 = 2

Index 1 = 5

11 in the tree? True

17 in the tree? False

Tree is [2, 5, 6, 7, 10, 11, 15]

O problema é que implementar __getitem__ não é o suficiente para obter toda a

semântica que esperaríamos de uma sequência.

len(tree)

>>>

TypeError: object of type 'IndexableNode' has no len()

A função nativa len requer outro método especial chamado __len__, que

necessariamente deve ser implementado em seu tipo personalizado de sequência.

class SequenceNode(IndexableNode):

def __len__(self):

_, count = self._search(0, None)

return count

tree = SequenceNode(

# ...

)

print('Tree has %d nodes' % len(tree))

>>>

Tree has 7 nodes

Infelizmente, ainda não é o bastante. Também é necessário implementar os

métodos count e index, que são esperados em uma sequência que se comporte

como list ou tuple. Percebemos que definir nossos próprios tipos contêineres é

uma tarefa bem mais difícil do que parece.

Para evitar essa dificuldade no universo Python, o módulo nativo collections.abc

define um conjunto de classes abstratas básicas que declaram interfaces para

todos os métodos típicos de cada tipo contêiner. Caso uma subclasse herde as

interfaces dessas classes abstratas básicas, mas não implementem os métodos

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!