Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Objetos en CPython
Jesús Espino García
[email protected]
@jespinog
24 de Noviembre de 2013
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Introducción
Python 3.3
Usaré ctypes para los ejemplos.
La estructura de un objeto en cpython.
Los objetos escritos en c de python.
El proceso de creación de un nuevo objeto.
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
¿Qué es un tipo en python?
Un tipo es una clase
Es una estructura compuesta de datos y slots
Los slots son punteros a funciones que definen comportamientos
Los tipos son objetos de python
Los tipos son de objetos de tipo tipo
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
¿Qué es un tipo en python?
pass
>>> class Prueba:
...
...
>>> type(Prueba)
<class ’type’>
>>> isinstance(Prueba, object)
True
>>> isinstance(type, object)
True
>>> type(type)
<class ’type’>
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
¿Qué es una instancia?
Es exactamente lo mismo que un objeto.
Es una zona reservada de la memoria con datos.
Tiene un tipo (y solo 1) que determina qué puede hacer el objeto.
El tipo de un objeto no cambia a lo largo de su vida (existen excepciones).
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
¿Qué es una instancia?
>>> prueba = Prueba()
>>> type(prueba)
<class ’__main__.Prueba’>
>>> prueba
<__main__.Prueba object at 0x7f3555af9bd0>
>>> Prueba
<class ’__main__.Prueba’>
>>> id(prueba)
139867047566288
>>> hex(id(prueba))
’0x7f3555af9bd0’
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Diagrama de herencia
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Diagrama de herencia
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Diagrama de herencia
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Estructura básica de un objetos
ob_refcnt: contador de referencias
ob_type: puntero al tipo de datos
Otros datos específicos para este tipo
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Estructura variable básica de un objetos
ob_refcnt: contador de referencias
ob_type: puntero al tipo de datos
ob_size: tamaño del objeto
Otros datos específicos para este tipo
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto None
Es el tipo más simple
Su instancia es singleton
No añade ningún dato extra a la estructura básica de objeto
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Very bad things
>>> ref_cnt = ctypes.c_long.from_address(id(None))
>>> ref_cnt.value = 0
Fatal Python error: deallocating None
Current thread 0x00007f2fb8d2a700:
File "<stdin>", line 1 in <module>
[2]
10960 abort (core dumped)
python3
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto int
ob_digit: array de enteros
El valor del entero es sum(map(lambda x: 1024*1024*1024, ob_size))
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto int
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto int
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> intsize = ctypes.sizeof(ctypes.c_int)
>>> x = 100
>>> ctypes.c_long.from_address(id(x) + longsize * 2)
c_long(1)
>>> ctypes.c_uint.from_address(id(x) + longsize * 3)
c_uint(100)
>>> x = 1024 * 1024 * 1024
>>> ctypes.c_long.from_address(id(x) + longsize * 2)
c_long(2)
>>> ctypes.c_uint.from_address(id(x) + longsize * 3)
c_uint(0)
>>> ctypes.c_uint.from_address(id(x) + longsize * 3 + intsize)
c_uint(1)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Very bad things
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> x = 1000
>>> int_value = ctypes.c_uint.from_address(id(x) + longsize * 3)
>>> int_value.value = 1001
>>> x
1001
>>> 1000
1000
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Very bad things
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> x = 100
>>> int_value = ctypes.c_uint.from_address(id(x) + longsize * 3)
>>> int_value.value = 101
>>> x
101
>>> 100
101
>>> 100 + 2
103
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto bool
Realmente son 2 instancias int con un tipo específico y valores 0 y 1
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto bool
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> ctypes.c_long.from_address(id(True) + longsize * 2)
c_long(1)
>>> ctypes.c_uint.from_address(id(True) + longsize * 3)
c_uint(1)
>>> ctypes.c_long.from_address(id(False) + longsize * 2)
c_long(0)
>>> ctypes.c_uint.from_address(id(False) + longsize * 3)
c_uint(0)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Very bad things
>>> val = ctypes.c_int.from_address(id(True) + longsize * 2)
>>> val.value = 0
>>> val = ctypes.c_int.from_address(id(True) + longsize * 3)
>>> val.value = 0
>>> True == False
True
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto float
ob_fval: es un double
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto float
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> x = 1.5
>>> ctypes.c_double.from_address(id(x) + longsize * 2)
c_double(1.5)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto complex
cval: dos valores double real e imag
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto complex
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> doublesize = ctypes.sizeof(ctypes.c_double)
>>> x = 1 + 3j
>>> ctypes.c_double.from_address(id(x) + longsize * 2)
c_double(1.0)
>>> ctypes.c_double.from_address(id(x) + longsize * 2 + doublesize)
c_double(3.0)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto bytes
ob_shash: hash de la cadena o -1
ob_sval: cadena terminada en
0 (tipo C)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto bytes
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto bytes
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> charsize = ctypes.sizeof(ctypes.c_char)
>>> x = b"yep"
>>> ctypes.c_long.from_address(id(x) + longsize * 2)
c_long(3)
>>> hash(x)
954696267706832433
>>> ctypes.c_long.from_address(id(x) + longsize * 3)
c_long(954696267706832433)
>>> ctypes.c_char.from_address(id(x) + longsize * 4)
c_char(b’y’)
>>> ctypes.c_char.from_address(id(x) + longsize * 4 + charsize)
c_char(b’e’)
>>> ctypes.c_char.from_address(id(x) + longsize * 4 + charsize * 2)
c_char(b’p’)
>>> ctypes.c_char.from_address(id(x) + longsize * 4 + charsize * 3)
c_char(b’\x00’)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto bytearray
ob_exports: memoryviews apuntando a este objeto
ob_alloc: contabiliza el número de bytes almacenados
ob_bytes: puntero a la posición de los bytes almacenados
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto bytearray
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> charsize = ctypes.sizeof(ctypes.c_char)
>>> x = bytearray(b"yep")
>>> ctypes.c_long.from_address(id(x) + longsize * 2)
c_long(3)
>>> ctypes.c_long.from_address(id(x) + longsize * 3)
c_long(0)
>>> ctypes.c_long.from_address(id(x) + longsize * 4)
c_char(4)
>>> addr = ctypes.c_void_p.from_address(id(x) + longsize * 5).value
>>> ctypes.c_char.from_address(addr)
c_char(b’y’)
>>> ctypes.c_char.from_address(addr + charsize)
c_char(b’e’)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto tuple
ob_item: array de punteros a PyObject
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto tuple
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> x = (True, False)
>>> ctypes.c_long.from_address(id(x) + longsize * 2)
c_long(2)
>>> ctypes.c_void_p.from_address(id(x) + longsize * 3)
c_void_p(140048684311616)
>>> ctypes.c_void_p.from_address(id(x) + longsize * 4)
c_void_p(140048684311648)
>>> id(True)
140048684311616
>>> id(False)
140048684311648
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
Very Bad Things
>>> longsize = ctypes.sizeof(ctypes.c_long)
>>> x = (1, 2, 3)
>>> tuple_size = ctypes.c_long.from_address(id(x) + longsize * 2)
>>> tuple_size.value = 2
>>> x
(1, 2)
Jesús Espino García
Objetos en CPython
Introducción
Definiciones
Estructura de objetos
Tipos en CPython
El objeto lista
ob_item: puntero a punteros de PyObject
allocated: memoria reservada actualmente para la lista
Jesús Espino García
Objetos en CPython
Intro
Comentarios de: Objetos en CPython (0)
No hay comentarios