Métodos mágicos en Python 3

Slides:



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

Curso de java básico (scjp)
Lenguajes de Programación
Python CI-2200 Programación Avanzada en Sistemas UNIX.
Comunicación con el servidor, RPC GWT Google Web Toolkit Prof. Ing
Interpretando objetos
© Lic. Fernando Campos Camacho
Tema 2: Lenguaje PHP básico
Comparación entre ANSI C y Python
Seminario de Lenguajes A – Opción Ada Seminario de Lenguajes A – Opción Ada – Raúl Champredonde1 Overloading de subprogramas procedure Put(Item: in integer;
Desarrollo de sitios web con PHP y MySQL
Ejercicios con listas.
Marzo 2007 Lenguajes Visuales Clase III.
Clases abstractas no polimórficas para C++ Universidad de Costa Rica Escuela de Ciencias de la Computación e Informática Agenda.
Técnicas avanzadas de programación Interfaces
ISA (Instruction Set Architecture)
Colecciones.
Programación orientada a objetos
PL/SQL Francisco Moreno Universidad Nacional. Introducción al PL/SQL ¿Por qué PL/SQL? A pesar de que SQL tiene mecanismos de control condicional (cláusula.
Repaso/resumen Introducción a la programación Orientada a Objetos 1.Strings 2.Archivos 3.Clases y objetos 4.Herencia 5.Ventanas 6.Dibujos y Gráficos.
SCJP SUN CERTIFIED PROGRAMMER FOR JAVA 6. SEMANA TRES ASIGNACION.
LAS LISTAS DAY /6/15 SPAN 4350 Cultura computacional en español Harry Howard Tulane University.
JAVA J.A.C..
Numeric Types, Expressions, and Output
Tema 1: Lenguaje PHP básico Ing. Tulio Nel Benavides Peña
Pulse para añadir texto Desarrollo de sitios web con PHP y MySQL Tema 2: Lenguaje PHP básico Elaborado por: José Mariano González Romano
Sintaxis de C# (Declaraciones y Tipos)
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
¿Qué hora es? Son las diez.
Objective Distinguish the rules to form the plural of a noun.
Herramientas de polimorfismo y herencia en C++
El Concepto de Tipo Los tipos permiten indicar la característica de los valores (datos) manipulados en un programa. Toda variable tiene asociado un tipo.
Programación orientada a objetos. El método main es el comportamiento por el cual comienzan todos los programas en Java, de la misma forma en la que C,
Hoy es martes. La fecha es el 4 de febrero LA PREGUNTA: Translate We practice basketball in gym class. Carlos and Carlota skateboard. Manuel and I sing.
Clases y Objetos. Clases La definición mas sencilla tiene la forma:
Servlets Servlets son módulos que extienden a servidores orientados a request/response, como por ejemplo Servidores Web “java-enabled”. Un servlet puede.
Sesión 14: Python (5) – Aplicaciones. 2009/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Circuitos Digitales III 2010/1 Informática.
Programación III Clase #03 Operadores. Expresiones Es cualquier cosa que retorne un valor. En C++ CASI todo son expresiones. Ejemplo: –5 –3 + 2 Las expresiones.
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
1 Algunas ideas básicas de C++ Agustín J. González ELO-329.
Programación orientada a objetos Capítulo 4 Agrupar objetos.
Fundamentos de Programación
Características Objeto Relacionales en Oracle Francisco Moreno Universidad Nacional.
Lógica de Programación COIS 115 Profesor: Gustavo Velez.
A Vocabulary Review Activity Setup Directions:  Type a vocabulary word on each of the following 10 slides in the subtitle textbox. When complete, run.
By Jimmy Wendt, Mike Kalis, and Craig Wocl.  In 2005, Carlos Beltran signed a 7 year, $119 million contract to play with the New York Mets  At the time,
Adjective Agreement. Adjective Agreement (Sing.) To describe one person or thing, use ES + a singular adjective. Ejemplo: 1. El libro es divertido. (The.
LICETH CAJAS 3RO ASI 26/10/2010. Es un lenguaje de programación diseñado para crear una amplia gama de aplicaciones que se ejecutan en.NET Framework,
Programación orientada a objetos Capítulo 3 Interacción de objetos.
Camilo Andrés Salazar González FORTRAN.  Estructura program circulo Real :: r, area write (*,*) 'Escribe el radio r:' read (*,*) r area = *r*r.
El módulo “tracemalloc”
Control, adquisición y monitoreo con Arduino y Visual Basic .net
Taller de Java Universidad de los Andes
Convenciones de nomenclatura y diseño
Organización de computadoras
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Searching data in Arrays
Desde «hola mundo» a conexiones con Bases de datos
Fundamentos básicos del lenguaje C#. Parte 1 Introducción a C#
Diego Hernández R Pascal Variables Diego Hernández R
Integration Services.
PROGRAMACIÓN (2).
Estructuras de Control 3 Ciclos
CC 1002: Introducción a la Programación Clase 22
Capítulo 7 USO DE BASES DE DATOS OBJETO- RELACIONALES.
CC 1002: Introducción a la Programación Clase 15: Estructuras mutables
Arrays Programming COMP102 Prog. Fundamentals I: Arrays / Slide 2 Arrays l An array is a collection of data elements that are of the same type (e.g.,
Expresiones– Parte 2 PYTHON PARA TODOS Expresiones.
Funciones Capítulo 4 Python para Todos PYTHON PARA TODOS
Variables, Expresiones y Enunciados
Transcripción de la presentació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 mágicos en Python 3 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

Métodos mágicos en Python 3 >>> 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

Métodos mágicos en Python 3 >>> 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

Métodos mágicos en Python 3 >>> class intX(int) : ... def __lt__(self, v) : ... return True ... def __gt__(self, v) : >>> a=intX(10) >>> a 10 >>> a<5 >>> a<=5 True False >>> a>20 >>> a>=20 >>> a<a True >>> a>a >>> 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

Métodos mágicos en Python 3 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. Explícito mejor que implícito. Legibilidad. Métodos mágicos en Python 3 PyConES 2014 10

Métodos mágicos en Python 3 vector = vector1 + vector2 vector= vector1.add(vector2) vector = 5 * vector1 vector = vector1.resize(5) dotprod = vector1*vector2 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

Métodos mágicos en Python 3 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

Métodos mágicos en Python 3 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) PyConES 2014 7

Métodos mágicos en Python 3 Si hay tiempo: __del__: Ciclos. __new__: Singleton. __slots__: Weakrefs. __copy__, __deepcopy__ : objetos inmutables. PyConES 2014 6

Métodos mágicos en Python 3 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 Methodshttp://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

Métodos mágicos en Python 3 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

Métodos mágicos en Python 3 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) : 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

Métodos mágicos en Python 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

Métodos mágicos en Python 3 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 File "<stdin>", line 3, in __getattribute__ ZeroDivisionError: division by zero PyConES 2014 1