Dans le prolongement de la réponse de Tadeck à propos de Django, l'utilisation de 'class Meta:' dans Django est aussi du Python normal.
La classe interne est un espace de nom pratique pour les données partagées entre les instances de la classe (d'où le nom Meta pour "métadonnées", mais vous pouvez l'appeler comme vous le souhaitez). Bien que dans Django il s'agisse généralement d'éléments de configuration en lecture seule, rien ne vous empêche de les modifier :
In [1]: class Foo(object):
...: class Meta:
...: metaVal = 1
...:
In [2]: f1 = Foo()
In [3]: f2 = Foo()
In [4]: f1.Meta.metaVal
Out[4]: 1
In [5]: f2.Meta.metaVal = 2
In [6]: f1.Meta.metaVal
Out[6]: 2
In [7]: Foo.Meta.metaVal
Out[7]: 2
Vous pouvez également l'explorer directement dans Django, par exemple :
In [1]: from django.contrib.auth.models import User
In [2]: User.Meta
Out[2]: django.contrib.auth.models.Meta
In [3]: User.Meta.__dict__
Out[3]:
{'__doc__': None,
'__module__': 'django.contrib.auth.models',
'abstract': False,
'verbose_name': <django.utils.functional.__proxy__ at 0x26a6610>,
'verbose_name_plural': <django.utils.functional.__proxy__ at 0x26a6650>}
Cependant, dans Django, il est plus probable que vous souhaitiez explorer la section _meta
qui est un Options
objet créé par le modèle metaclass
lorsqu'un modèle est créé. C'est là que vous trouverez toutes les informations "méta" de la classe Django. Dans Django, Meta
est juste utilisé pour passer des informations dans le processus de création de la _meta
Options
objet.
6 votes
Le titre pose la question de la méta Python, mais la question semble porter sur la méta Django - sur laquelle porte votre question ?
22 votes
@ckhan il est confus à cause de la décision absurde (IMO) d'appeler une classe imbriquée "Meta", ce qui est très trompeur ; pour les débutants, sur les métaclasses de Python, et pour les utilisateurs plus expérimentés qui ne l'ont jamais vu, sur son but a priori (au lieu d'utiliser des attributs de classe ou de vraies métaclasses)