desenvolvimento, python

Python Mixins

Um Mixin é um tipo especial de herança múltipla. Há duas situações principais onde são usadas:

1 – Deseja-se prover muitas características opcionais a uma classe.
2 – Deseja-se utilizar uma característica particular em várias classes diferentes.

Exemplo:

class Story(object):
    def __init__(self, name, content):
        self.name = name
        self.content = content

class StoryHTMLMixin(object):
    def render(self):
        return (
            "<html><title>%s</title><body>%s</body></html>" %
            (self.name, self.content))

class StoryHTML(Story, StoryHTMLMixin):
    pass

print StoryHTML(u'TÍTULO', u'CONTEÚDO').render()

A classe Story guarda atributos, enquanto a classe StoryHTMLMixin “decora” atributos com marcações de HTML. Veja que a classe mixin NÃO define os atributos que ela decora: ela espera que eles tenham sido definidos em outra classe (e eles foram, na Story!). A classe mixin sozinha não parece fazer sentido. Se for criado um objeto a partir dela e invocar o método render, será gerado um erro.

Finalmente é definida StoryHTML que utiliza de herança múltipla, e acaba por agregar/compor os atributos de Story com o método render de StoryHTMLMixin.

Neste exemplo, pelo fato da classe mixin usar os atributos name e content, há forte dependência com Story. Então o mixin está criando mais uma camada de complexidade que poderia ser evitada usando herança simples (StoryHTML poderia herdar de Story e compor seus atributos com as marcações).

Mas se houver uma família de classes que segue um padrão na hora de nomear seus atributos (classes A, B, C, D, E, F e G possuem os atributos name e content), então uma mesma classe StoryHTMLMixin poderia ser agregada com qualquer uma dessas classes.

Mixins em geral não implementam um método __init__, porque sua principal razão de existir é contribuir com métodos para outras classes, e os objetos são fundamentalmente criados e inicializados por estas outras classes.

Referências:

http://stackoverflow.com/questions/533631/what-is-a-mixin-and-why-are-they-useful
http://stackoverflow.com/questions/4514803/diamond-problem-when-using-mixins-in-python
http://turing.com.br/wiki/index.php?title=Objetos_Pythonicos

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s