Métodos mágicos en Python 3

Documentos relacionados
Informe de Segunda Presentación

Clase 4: Modularizando código

Introducción a la Computación. Python avanzado. Maximiliano Geier. Facultad de Ciencias Exactas y Naturales, UBA 24/06/2015

Introducción a Python (3.x)

PL/SQL. DECLARE /* Parte Declarativa */ BEGIN /* Parte de Ejecución */ EXCEPTION /* Parte de Excepciones */ END;

Entendiendo Decoradores en Python

Curso de Python Inicial

Algorítmica. Curso 2009/2010. Seminario de Python 3 y El problema del Río Congo

Python Facundo Batista. Gracias especiales a nessita por su indispensable ayuda con LaTEXpara esta presentación

Tema 2. El lenguaje de programación Java (Parte 1)

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

Elementos léxicos del lenguaje de programación Java

Programación Orientada a Objetos Sentencias Java Parte I Ing. Julio Ernesto Carreño Vargas MsC.

5. Técnicas de Simulación 2. Programando C++

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

Lección 2 Introducción al lenguaje C

Colecciones. Nadjet Bouayad-Agha Programación 2007

Tema: Arreglos de Objetos en C++.

Tipos de Datos de python (1ª parte):

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Introducción al lenguaje JAVA

Lenguaje programación limbo

Programación n Orientada a Objetos Sentencias Java Parte I. Ing. Julio Ernesto Carreño o Vargas MsC.

Fundamentos del Lenguaje de Programación Java

Introducción al desarrollo de RIA's con Adobe Flex 3.0 Dia 4

Examen final de CL 11 de Enero de 2012 Fecha de publicación de notas: Fecha de revisión:

Nano Taller de Python

Python: Programación Orientada. JESSE PADILLA AGUDELO Ingeniero Electrónico

Tema: INTÉRPRETE ENSAMPOCO/3

TING! CICLOS DE NEGOCIO FORMACIÓN TÉCNICA MADRID JULIO 2010

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

4 o Ingeniería Informática

Python dentro de Postgres con PL/Python. PGDAY Ecuador 2011 PUCE Quito Milton Labanda Octubre 2011

Estructura de Datos [Tipos de datos concretos y tipos de datos abstractos]

Introducción a. Python. Unlux Facundo Batista. Introducci. Arte gráfico: Diana Batista. ó n a Python Unlux 2007

Laboratorio Informix. Stored Procedures Triggers

Pruebas de unidad con JUnit

Tema: Sobrecarga de Operadores.

Tutorial: Python + Soap Web Service. Daniel Montenegro Cordero

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Repaso de las características más importantes de la programación Java y su adaptación a Android

JavaScript. Contenidos. Introducción El lenguaje Validación de formularios. Programación en Internet DLSI - Universidad de Alicante 1

Tema 7. El sistema de clases

Tema 2. El lenguaje JAVA

Descripción y Contenido del Curso. Programación C++ Capacity Academy.

Introducción a PYTHON. Cesar Husillos & Víctor Terrón. Abril de 2014

Curso 0 de Informática

Introducción a Java LSUB. 15 de enero de 2015 GSYC

03.04 Unity. Integración de Sistemas. Parte II. Diseño e implementación de aplicaciones Web con.net

Clase 5: CLI, templates y excepciones

4. Operadores Operador asignación

Modelos de Software. Ingeniería en Sistemas de Información 2015

Una variable de clase escalar tiene un nivel de indirección igual a 1. Por ejemplo, las variables i, b y x definidas como se muestra a continuación.

Vectors (Vectores) Agustín J. González ELO329

CEFIRE: Curso Administración de APACHE

324 MR Versión 1 Prueba Integral 1/3 Semana 10 Lapso

Java es el lenguaje de programación que

Propedéutico de Programación

Tema 2: Introducción a Python

Álgebra y Matemática Discreta Sesión de Prácticas 1

ISA (Instruction Set Architecture) Arquitectura del conjunto de instrucciones

Tema 5 Diseño con Glade

GAMS (General Algebraic Modeling System)

MANUAL DE RUBY (PARTE V) Luis José Sánchez González

XQuery. Jose Emilio Labra Gayo Departamento de Informática Universidad de Oviedo. XQuery

Clase 31. Hashing (Dispersión) Motivación

Java para programadores

Tema: Tipos de datos y conversiones

PASCAL. Repaso de Pascal Introducción a Python. Pascal. Pascal - introducción. Pascal Declaraciones: Variables. Pascal Declaraciones: Tipos 07/04/2015

TEMA 7: Ficheros. TEMA 7: Ficheros Concepto de fichero

Soluciones Ejercicios Tema 3

Compiladores e Intérpretes Proyecto N 1 Sintaxis de MiniJava Segundo Cuatrimestre de 2015

Introducción a la programación orientada a objetos con Python

Cómo nombrar variables ( 2&

ELEMENTOS Y TIPOS DE DATOS

Clase 3: Archivos (texto, csv, dbf, Excel)

Introducción a Java LSUB. 30 de enero de 2013 GSYC

Práctica de constantes, expresiones y operadores. Programación en C 1

Anexo de documentación

Tema 1 Programación Funcional

Clases en Java. Declaración de clases en Java 02/09/16. Ing. Roberto Martínez Román - public class Alumno { private int matricula;

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Nano Taller de Python

VARIABLES, CONSTANTES Y EXPRESIONES ASIGNACIÓN. TIPOS ELEMENTALES. PRECEDENCIA DE LOS ESTRUCTURAS DE CONTROL. CONDICIONAL E

Temario detallado. Conceptos generales de lenguajes y compiladores. Proceso de compilación de un programa en C++ bajo Code::Blocks

Haga clic para PostgreS cambiar el estilo

Programando con Pl/Python

Transcripción:

Métodos mágicos en Python 3 Jesús Cea Avión jcea@jcea.es @jcea https://www.jcea.es/ PyConES 2014 15

Métodos que permiten definir o alterar comportamientos aparentemente implícitos. Alteración de clases estándar. Implementación de protocolos del lenguaje. PyConES 2014 14

>>> import this The Zen of Python, by Tim Peters Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Complex is better than complicated. [ ] Readability counts. [...] In the face of ambiguity, refuse the temptation to guess. PyConES 2014 13

>>> dir(int) [' abs ', ' add ', ' and ', ' bool ', ' ceil ', ' class ', ' delattr ', ' dir ', ' divmod ', ' doc ', ' eq ', ' float ', ' floor ', ' floordiv ', ' format ', ' ge ', ' getattribute ', ' getnewargs ', ' gt ', ' hash ', ' index ', ' init ', ' int ', ' invert ', ' le ', ' lshift ', ' lt ', ' mod ', ' mul ', ' ne ', ' neg ', ' new ', ' or ', ' pos ', ' pow ', ' radd ', ' rand ', ' rdivmod ', ' reduce ', ' reduce_ex ', ' repr ', ' rfloordiv ', ' rlshift ', ' rmod ', ' rmul ', ' ror ', ' round ', ' rpow ', ' rrshift ', ' rshift ', ' rsub ', ' rtruediv ', ' rxor ', ' setattr ', ' sizeof ', ' str ', ' sub ', ' subclasshook ', ' truediv ', ' trunc ', ' xor ', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes'] >>> help(int. lt ) lt (self, value, /) Return self<value. PyConES 2014 12

>>> class intx(int) :... def lt (self, v) :... return True... def gt (self, v) :... return True >>> a=intx(10) >>> a 10 >>> a<5 >>> a<=5 True False >>> a>20 >>> a>=20 True False >>> a<a True >>> a>a True >>> class extender(int) :... def mul (self, v) :... return v * int('1'*self) >>> a=extender(4) >>> a 4 >>> 3*a 12 >>> a*3 3333 >>> a*a 1234321 Si cambiamos a self*'1': RuntimeError: maximum recursion depth exceeded while calling a Python object PyConES 2014 11

Interoperatividad de tipos. Abstract Base Classes. Un dir muestra los métodos mágicos definidos, pero no todos los posibles: >>> a = 5; a +=1; print(a) 6 >>> a. iadd Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'int' object has no attribute ' iadd ' El Zen de Python es una guía valiosa: Belleza y elegancia. Evitar sorpresas. Métodos mágicos en Python 3 Explícito mejor que implícito. Legibilidad. PyConES 2014 10

vector = vector1 + vector2 vector = 5 * vector1 dotprod = vector1*vector2 vector= vector1.add(vector2) vector = vector1.resize(5) escalar = vector1.dotprod(v2) if poly1 < poly2 : if poly1.area < poly2.area : poly = poly1 * poly2 poly = poly1.intersect(poly2) If user1 in user2.amigos : if user2.is_amigo(user1) : user2.amigos += user1 user2.add_amigo(user1) PyConES 2014 9

Aritméticos: mul, abs, add, neg, float, ceil, lshift, Para a*b, b*a y a *=b. Lógicos: and, or, xor, not, lt, le, gt, ge, eq, ne, Conversión: float, format, repr, str, bytes, int, bool, Clase: class, doc, new, subclasscheck, slots,... Gestión de instancias: init, del, isinstancecheck,... Interacción: hash, getattr, getattribute, setattr, delattr, dir, call, len, getitem, setitem, delitem, iter, contains, reversed,... PyConES 2014 8

Context Managers: enter, exit. with open( file, r ) as f : Descriptores: set, get, delete. vector.x = 5 if poligono.area < 10 : Copiar objetos: copy, deepcopy. copy.copy(objecto) Pickling: getinitargs, getnewargs, getstate, setstate, reduce, reduce_ex. pickle.dumps(grafo) Varios: sizeof sys.getsizeof(objeto) Métodos mágicos en Python 3 PyConES 2014 7

Si hay tiempo: del : Ciclos. new : Singleton. slots : Weakrefs. copy, deepcopy : objetos inmutables. PyConES 2014 6

Python 3.4.2 documentation 3. Data model 3.3. Special method names https://docs.python.org/3/reference/datamodel.html#special-method-names A Guide to Python's Magic Methods http://www.rafekettler.com/magicmethods.html Dive into Python 3 Special Method Names http://www.diveintopython3.net/special-method-names.html No nos metemos con atributos mágicos como: name qualname class doc dict weakref... PyConES 2014 5

Pickle: https://docs.python.org/3/library/pickle.html. Ojo, deserializar SOLO desde fuentes seguras: find_class(). Métodos mágicos: getinitargs(), getnewargs(), getnewargs_ex(), getstate(), setstate(), reduce(), reduce_ex(). Object DB: persistent_id(), persistent_load(). No todo es serializable, aunque getstate() ayuda. Ejemplo ROCKS. PyConES 2014 4

Metaclases: prepare : Inicializa el namespace. Por ejemplo, diccionario ordenado, prohibir métodos duplicados, verificar APIs. class meta(type): def prepare (name, bases, **kwds) : class dictnodups(dict) : def setitem (self, k, v) : if k in self : raise RuntimeError(' Nombre duplicado! %s' %k) return super(). setitem (k, v) return dictnodups() class ejemplo(metaclass=meta) : def a(self) : pass def b(self) : pass a = 5 Métodos mágicos en Python 3 Traceback (most recent call last): File "z.py", line 10, in <module> class ejemplo(metaclass=meta) : File "z.py", line 15, in ejemplo a = 5 File "z.py", line 6, in setitem raise RuntimeError(' Nombre duplicado! %s' %k) RuntimeError: Nombre duplicado! a PyConES 2014 3

Limitación: los métodos mágicos deben definirse a nivel de clase (es decir, en el tipo), no de instancia (consistencia interna del intérprete): >>> class obj :... def len (self) :... return 3... >>> a = obj() >>> a. len = lambda : 5 >>> len(a) 3 PyConES 2014 2

Normalmente también ignoran getattribute () (velocidad a costa de flexibilidad): >>> class obj :... def getattribute (*dummy) :... 1/0... >>> a = obj() >>> len(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: object of type 'obj' has no len() >>> a.abc Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in getattribute ZeroDivisionError: division by zero PyConES 2014 1