comment il associe la classe int ou une chaîne à ma variable
Python ne fait pas. Les variables n'ont pas de type. Seul l'objet qu'une référence de variable a un type. Les variables sont simplement noms pointant vers des objets.
Par exemple, ce qui suit montre également le type d'un objet, mais aucune variable est impliqué:
>>> type(1)
<class 'int'>
>>> type('foobar')
<class 'str'>
Lorsque vous utilisez type(variable)
, la variable
partie de l'expression retourne simplement l'objet que les références de nom , en passant dans l'objet à la fonction type()
. Lorsque vous utilisez 1
ou 'foobar'
, l'expression est un littéral produisant l'objet, qui est ensuite transmis à la fonction type()
.
Les objets Python sont simplement des structures de données dans la mémoire de l'interpréteur; dans CPython C, les structures sont utilisées. Les variables sont simplement des références (pointeurs) à ces structures. Le type de base struct dans CPython est appelé PyObject
, et cette structure a un ob_type
slot qui indique à Python de quel type est quelque chose. Les types sont simplement more C structures.
Si vous voulez suivre dans le code source CPython, vous commenceriez à l'bltinmodule.c
source code (depuis type
est un nom intégré), qui defines type
as the PyType_Type
structure. Appel d'un type (type
est un type aussi) invoque leur tp_new
function et PyType_Type
defines that comme the type_new
function. Cette fonction gère les appels avec un argument comme suit:
/* Special case: type(x) should return x->ob_type */
{
const Py_ssize_t nargs = PyTuple_GET_SIZE(args);
const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
PyObject *x = PyTuple_GET_ITEM(args, 0);
Py_INCREF(Py_TYPE(x));
return (PyObject *) Py_TYPE(x);
}
Ici x
est l'objet PyObject
que vous avez passé dans; notez, pas une variable, mais un objet! Ainsi, pour votre objet entier 1
ou 'foobar'
objet chaîne, le résultat macro Py_TYPE()
est renvoyé. Py_TYPE
is a macro qui renvoie simplement la valeur ob_type
de toute struct PyObject
. Donc maintenant vous avez l'objet type pour 1
ou 'foobar'
; comment se fait-il que vous voyez <class 'int'>
ou <class 'str'>
dans votre session d'interprète? L'interpréteur interactif Python utilise automatiquement le repr()
function sur les résultats d'expression. Dans la structure C pour les définitions PyType_Type
, la structure PyType_Type
est incorporée de sorte que tous les emplacements pour ce type sont directement disponibles; Je vais omettre ici exactement comment fonctionne . Pour les objets de type, en utilisant repr()
signifie que le type_repr
function est appelé qui retourne ceci:
rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
Donc à la fin, type(1)
obtient la fente ->ob_type
, (qui se révèle être le PyLong_Type
struct en Python 3, longue histoire), et cette structure a un tp_name
slot set to "int"
.
TL; DR: Les variables Python n'ont aucun type, elles sont simplement des pointeurs vers des objets. Les objets ont des types, et l'interpréteur Python suivra une série de références indirectes pour atteindre le nom de type à imprimer si vous faites écho à l'objet dans votre interpréteur.
@GreenAsJade: L'OP utilise Python 3, où la représentation des objets 'type' utilise' 'class'', pas''type''; ceci a été fait pour refléter que les types définis en C sont aussi des classes. –
@ MartijnPieters peut-être besoin d'un tag python3 alors? – GreenAsJade
@GreenAsJade: non, la réponse est la même dans Python 2 et 3. Mais la sortie fournie n'a pas besoin d'être corrigée. –