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.

inheritance). Uma herança losangular acontece quando uma subclasse obtém

herança a partir de duas classes separadas, mas essas duas classes têm a mesma

superclasse em algum lugar da hierarquia. O caminho que liga hierarquicamente

as quatro classes forma um losango (ou diamante, como é conhecido na língua

inglesa). A herança losangular faz com que o método __init__ da superclasse

que as classes compartilham seja executado mais de uma vez, causando

comportamento inesperado. Por exemplo, o código a seguir define duas classesfilha

herdeiras de MyBaseClass.

class TimesFive(MyBaseClass):

def __init__(self, value):

MyBaseClass.__init__(self, value)

self.value *= 5

class PlusTwo(MyBaseClass):

def __init__(self, value):

MyBaseClass.__init__(self, value)

self.value += 2

Então, é definida uma classe-filha que herda das duas classes, deixando

MyBaseClass no vértice superior do losango.

class ThisWay(TimesFive, PlusTwo):

def __init__(self, value):

TimesFive.__init__(self, value)

PlusTwo.__init__(self, value)

foo = ThisWay(5)

print('Should be (5 * 5) + 2 = 27 but is', foo.value)

>>>

Should be (5 * 5) + 2 = 27 but is 7

A saída é 27 porque (5 * 5) + 2 = 27. Porém, a chamada ao construtor da

segunda classe-mãe, PlusTwo.__init__, causa a redefinição do valor armazenado

em self.value para 5 no momento em que MyBaseClass.__init__ é chamada pela

segunda vez.

Para resolver o problema, o Python 2.2 introduziu a função nativa super e

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!