Métodos mágicos en Python 3

Documentos relacionados
Informe de Segunda Presentación

Clase 4: Modularizando código

Introducción a Python (3.x)

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

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

Entendiendo Decoradores en Python

Tema 3 Cuestiones avanzadas

Curso de Python Inicial

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

Junio 16 de Junio 2015

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

podría devolver como resultado una imagen en la que se mostraran las diferencias así:

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

Elementos léxicos del lenguaje de programación Java

Estructuras de control

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

Centro Asociado Palma de Mallorca. Antonio Rivero Cuesta

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

Tema: Arreglos de Objetos en C++.

Colecciones. Nadjet Bouayad-Agha Programación 2007

Introducción al lenguaje JAVA

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

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

public static void main(string[ ] args) { Numero f1 = new Numero(3); Numero f2 = new Numero(4); Numero f3 = f1; f1.value = f2.value; Numero f4 = null;

Lección 2 Introducción al lenguaje C

15. ANEXO # 5 GAMEPLAYOBJECT

Lenguaje programación limbo

Fundamentos del Lenguaje de Programación Java

Tema 3. Tipos de datos simples

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

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

Tipos de Datos de python (1ª parte):

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

Pruebas de unidad con JUnit

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

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

Tema: Sobrecarga de Operadores.

Laboratorio Informix. Stored Procedures Triggers

Tema: INTÉRPRETE ENSAMPOCO/3

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

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

Cómo nombrar variables ( 2&

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

Nano Taller de Python

CONCEPTOS BASICOS DEL LENGUAJE JAVA

Introducción al lenguaje C

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

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

El lenguaje Python. Programación Declarativa Avanzada. Curso

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

Tutorial: Python + Soap Web Service. Daniel Montenegro Cordero

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

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.

Java es el lenguaje de programación que

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

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

ELEMENTOS Y TIPOS DE DATOS

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

Curso 0 de Informática

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

CEFIRE: Curso Administración de APACHE

GAMS (General Algebraic Modeling System)

Tema 2. El lenguaje JAVA

Reflexiones en el diseño de APIs

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

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

Tema 7. El sistema de clases

Tema 1 Programación Funcional

Índice Introducción Estructuras Algebraicas Listas Los Números Enteros Polinomios. Álgebra y Matemática Discreta Sesión de Prácticas 1

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

4 o Ingeniería Informática

Resumen Lenguaje Java

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

Anexo de documentación

Tema 2: Introducción a Python

V. Elementos de la Arquitectura

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

ISA (Instruction Set Architecture) Arquitectura del conjunto de instrucciones

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

Tema 5 Diseño con Glade

Tema: Tipos de datos y conversiones

Propedéutico de Programación

BASES DE DATOS OBJETO-RELACIONALES

Práctica 3 mtp. metodoloxía e tecnoloxía da programación. Presentar detalles básicos sobre la sintaxis del lenguaje de programación Java.

Práctica 4: Herencia. Objetivos:

Clase 5: CLI, templates y excepciones

4. Operadores Operador asignación

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

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

Patrones de diseño. Sesión 1: Introducción y patrones básicos. Especialista Universitario Java Enterprise

Nano Taller de Python

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

Estructura de las Aplicaciones Orientadas a Objetos Herencia de clases

Coordinación n de Componentes mediante Conectores Implementados con Servicios Web

Haga clic para PostgreS cambiar el estilo

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

Isabelle como un lenguaje funcional

Java para programadores

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

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Transcripción:

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

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

>>> 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. Codemotion 2014 15

>>> 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. Codemotion 2014 14

>>> 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 Codemotion 2014 13

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. Codemotion 2014 12

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) Codemotion 2014 11

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,... Codemotion 2014 10

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 Codemotion 2014 9

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

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... Codemotion 2014 7

Lo siguiente queda como ejercicio para casa :) ( muahahaha!) Codemotion 2014 6

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. Codemotion 2014 5

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 Codemotion 2014 4

Cosas que te pueden morder el culo (la vida es dura) Codemotion 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 Codemotion 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 Codemotion 2014 1

Veda de preguntas abierta :-) :-) :-) Codemotion 2014 0