PDF de programación - Objetos en CPython

Objetos en CPythongráfica de visualizaciones

Publicado el 14 de Enero del 2017
824 visualizaciones desde el 14 de Enero del 2017
432,3 KB
48 paginas
Creado hace 10a (03/01/2014)
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
  • Links de descarga
http://lwp-l.com/pdf1529

Comentarios de: Objetos en CPython (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad