2012/12/3 Matheus Lima <
mathe...@gmail.com>
> Alguém tem algum material, link ou postagem que explique se existe alguma
> utilização especial para a "class Meta" dentro de outra classe, como é muito
> comum no Django.
>
> Ela tem uma função específica? Por que ela não herda de "Object"? Ou é
> apenas uma classe como qualquer outra?
Definir uma classe dentro de outra é algo que em 10 anos de Python eu
nunca tinha visto até estudar Django, e não consigo pensar em um bom
motivo para fazer isso fora do Django.
O Django usa esta convenção apenas para evitar conflito de nomes entre
as opções de configuração da classe e os atributos (os descritores)
que definem os campos do model. Por exemplo, existe uma opção meta
chamada "abstract" (para dizer que é uma classe abstrata, sem
instâncias no BD) mas não é difícil imaginar uma aplicação que lida
com artigos científicos que precise ter um campo de dados chamado
"abstract".
O interpretador Python não dá nenhum tratamento especial para uma tal
classe interna, ela vira simplesmente um atributo da classe dentro da
qual é definida (um exemplo de composição, e não de herança).
No Django esta classe Meta não herda de object simplesmente porque ela
é uma classe old-style (e antigamente *não podia* herdar de object
porque o Django não sabia lidar com uma classe new-style naquele
contexto, não sei se já consegue em algum release, mas no Django 1.5
vai ter que conseguir, porque no Python 3 só existem classes
new-style).
[ ]s
Luciano
PS. Em Java é comum o uso de classes internas (inner classes) e existe
até uma sintaxe para classes internas anônimas (anonymous inner
classes) porém essa sintaxe existe em Java para resolver um problema
que nós não temos em Python: em Java isso é usado para definir
callbacks, uma vez que não é possível passar referências a métodos. Em
Python a gente passa referências para funções e métodos sem maiores
dramas.
>
> --
> Att,
>
> Matheus dos Santos Lima
>
>
Luciano Ramalho / OFICINAS TURING
Twitter: @ramalhoorg
Autor e professor dos cursos:
* Objetos Pythonicos -->
http://turing.com.br/oopy
* Python para quem sabe Python -->
http://turing.com.br/ppqsp