class Meta - qual a real utilidade?

826 views
Skip to first unread message

Matheus Lima

unread,
Dec 3, 2012, 3:04:07 PM12/3/12
to python...@googlegroups.com

Boa tarde,

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?

--
Att,

Matheus dos Santos Lima     


Bruno Rocha

unread,
Dec 3, 2012, 3:13:23 PM12/3/12
to python...@googlegroups.com

Esta classe armazena metadados do model, a existencia desta classe serve simplesmente para separar os atributos do model de seus metadados. É apenas uma questão de escopo/namespace e por isso não há necessidade de herdar.

Bruno Rocha
http://rochacbruno.com.br
mobile

--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com

Matheus Lima

unread,
Dec 3, 2012, 3:17:39 PM12/3/12
to python...@googlegroups.com
Mas é algo da linguagem ou uma convenção mesmo? (minha dúvida é mais nesse ponto). Por exemplo, uma "class Meta" é tratado pelo interpretador de forma diferenciada de um "class AlgumaCoisa"?

Bruno Rocha

unread,
Dec 3, 2012, 3:20:10 PM12/3/12
to python...@googlegroups.com

é uma convenção do Django. O sistema de models do Django procura esta subclasse ao inspecionar o model.

Bruno Rocha
http://rochacbruno.com.br
mobile

Matheus Lima

unread,
Dec 3, 2012, 3:23:08 PM12/3/12
to python...@googlegroups.com
Obrigado pela resposta :)

Luciano Ramalho

unread,
Dec 3, 2012, 3:41:56 PM12/3/12
to python...@googlegroups.com
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
>
>
> --
> ------------------------------------
> Grupo Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
>
> <*> Para visitar o site do grupo na web, acesse:
> http://groups.google.com/group/python-brasil
>
> <*> Para sair deste grupo, envie um e-mail para:
> python-brasi...@googlegroups.com




--
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

Pedro Werneck

unread,
Dec 3, 2012, 4:00:13 PM12/3/12
to python...@googlegroups.com
Uma classe em Python apenas um namespace separado, e que por "acaso" contém métodos mágicos que servem para várias coisas, dentre elas criar outros namespaces/instâncias. Alguns usam classes em algumas situações somente por essa funcionalidade, de namespace. É o caso da classe Meta do Django.

Já houve propostas de criar uma keyword mais genérica para criar namespaces em Python, sem esse peso semântico trazido pelo uso da palavra 'class', mas infelizmente foram todas rejeitadas. A minha favorita foi a keyword make.





2012/12/3 Luciano Ramalho <luc...@ramalho.org>



--
---
Pedro Werneck

Eduardo Cereto Carvalho

unread,
Dec 3, 2012, 4:49:58 PM12/3/12
to python...@googlegroups.com
Um bom exemplo de uso de Inner Class.


Ao meu ver tudo que voc^e pode fazer com Inner Classes também pode fazer sem elas. Então a motivação para uisar Inner Classes realmente é apenas organização de Código. Se uma classe só vai ser usada dentro de outra classe então você organiza ela dessa forma. Mas como isso geralmente adiciona complexidade ao código geralmente as pessoas evitam.

Eduardo Cereto Carvalho



2012/12/3 Pedro Werneck <pjwe...@gmail.com>
Reply all
Reply to author
Forward
0 new messages