Praktische Anwendung von Metaklassen

Ähnliche Dokumente
Programmierkurs Python I

Ausnahmen-Behandlung

Funktionen (fortgeschritten)

Programmierkurs Python I

Meta Programming and Reflection in Java

Python Zahlen, Strings Logik Kontrollstrukturen. Scriptsprachen. Python Basics. Sascha Winter

Grundlagen. Felix Döring, Felix Wittwer 24. April Python-Kurs

1 14. Vorlesung: Klassen, Vererbung

SmallTalk - Eine kurze Einführung

Objektorientiertes Programmieren II

13. Java Klassen. Lernziele. Klassen - Technisch. Definition: Klassen

12. Java Klassen. Klassen - Technisch. Beispiel: Erdbebendaten. Klassen - Konzeptuell

Programmierkurs Python I

Pyro - Python Remote Objects

Objektorientierung. Marc Satkowski 20. November C# Kurs

Zwei Arten von Attributen. Klassenvariablen. Introspektion. getattr(object_instance, string)

Praxis der Programmierung

C++11. neu in C++11: range-based for. Objektorientierte Programmierung mit C++ Ersetzung durch: 1. Elementares C++ int array[] = { 1, 2, 3, 4, 5 };

Klassen als Objekte. Smalltalk vs. Objective-C. Self-Nachrichten an Klassen in Objective-C. Klassen als Objekte. Smalltalk: Everything is an object

Algorithmik und Programmieren

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Nachtrag: Vergleich der Implementierungen von Stack

Zwei Arten von Attributen

hue10 January 15, 2017

Concurrency and Processes of Pthreads

Einführung in die Programmiertechnik

! können default arguments haben: ein Endstück der Argumentliste einer Deklaration mit Wertevorgaben

1 Eine Einführung in die objektorientierte Programmierung

Implementieren von Klassen

Informatik I. Informatik I Iteratoren Generatoren Das Modul itertools. Iterierbare Objekte Iteratoren. Python-Interpreter

Fachgebiet Softwaretechnik, Heinz Nixdorf Institut, Universität Paderborn. Testen. Tutorial im Rahmen des Software(technik)praktikums SS 2012

DATEC Datentechnik GmbH. Python Programming. Monthly Python. Lösungen zu ausgewählten technischen Problemstellungen. 3.

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

13. Java Klassen. Klassen, Typen, Objekte, Deklaration, Instanzierung, Konstruktoren, Kapselung, statische Felder und Methoden

Einführung in Python

Objektorientierte Programmierung mit C Datentypen (Strukturtypen)! p.name = "Willibald Wusel";

Informatik - Übungsstunde

Algorithmen und Datenstrukturen

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Klassenbeziehungen & Vererbung

Introduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2016

Sun s Java Code Conventions

Informatik - Übungsstunde

3.3 Entwurf von Datentypen

pue09 December 16, 2016

Lernteam OOP3 SW Programmieren 1 - H1103 Felix Rohrer

Informatik I: Einführung in die Programmierung 3. Werte, Typen, Variablen und Ausdrücke

Sichtbarkeiten, Klassenmember und -methoden

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

Funktionen in Python

Aufgabe 2a. ios-praktikum Alexander Neitz

Info B VL 11: Innere Klassen/Collections

Exceptions und Vererbung

Universität Karlsruhe (TH)

Programmieren I. Fehlerbehandlung Exceptions. Heusch 2. Bd, 3 Ratz 10. Institut für Angewandte Informatik

Python-Workshop. Python für C/C++ Programmierer. Carl Friedrich Bolz. Carl Friedrich Bolz

Konstruktor/Destruktor

Einführung in die Programmierung Wintersemester 2008/09

const Zwei Schlüsselwörter bei der Deklaration von Variablen und Member-Funktionen haben wir noch nicht behandelt: const und static.

Prof. W. Henrich Seite 1

Prof. Dr. Wolfgang Schramm. Vorlesung. Techniken der Programmentwicklung. Exkurs: Anonyme Klassen

Vererbung und Polymorphie

C# - Einführung in die Programmiersprache Methoden. Leibniz Universität IT Services

Python 2. Vorlesung Computerlinguistische Techniken Alexander Koller. 28. Oktober 2014

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

14 Abstrakte Klassen, finale Klassen, Interfaces

Programmierkurs Java

Namespace Packages. Martin v. Löwis. Freitag, 18. Mai 12

Objekt-orientierte Programmierung

Visuelle Kryptographie. Anwendung von Zufallszahlen

12 Abstrakte Klassen, finale Klassen und Interfaces

Programmieren in Python

1 Berechnung von Summen (ca = 10 Punkte)

14 Abstrakte Klassen, finale Klassen, Interfaces

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Mails in Python senden

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Vorbereitende Aufgaben

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Programmieren in Python

Funktionen. Überblick über Stored Functions. Syntax zum Schreiben einer Funktion. Schreiben einer Funktion

Teil 5 - Java. Programmstruktur Operatoren Schlüsselwörter Datentypen

Java I Vorlesung 6 Referenz-Datentypen

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

NotesSession.GetPropertyBroker( )

Die freie Programmiersprache Python mit Beispielen für ihren praktischen Einsatz. Python User Group Köln

C++ Bit-Access. Detlef Wilkening

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Grundlagen von Python

Properties und Proxies

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Programmentwicklung ohne BlueJ

Introduction to Python. Introduction. First Steps in Python. pseudo random numbers. May 2018

Modernes C++ Compilation Firewall Exception-Safe Function Calls. Philippe Lieser

Theorie zu Übung 8 Implementierung in Java

hue08 December 16, 2016

kurze Wiederholung class templates

beehive GmbH (Hrsg.) ZOPE Content-Management- & Web-Application-Server IBJ dpunkt.verlag

Programmieren in Python

Transkript:

Praktische Anwendung von Metaklassen Mirko Dziadzka http://mirko.dziadzka.de/ @MirkoDziadzka PyCon DE 2012 1 / 27

Wer bin ich Wer bin ich? Bewege mich mit Softwareentwicklung auf dem Gebiet Unix, Netzwerk, Security Benutze Python seit ca. 1995... in Projekten mit > 100 000 LOC Zur Zeit bei Riverbed Technology in Regensburg 2 / 27

Wer seid ihr? Wer seid ihr? Wer weiss, was Metaklassen sind? Wer schon mal welche benutzt? Wer benutzt Dekoratoren? Wer benutzt Klassen Dekoratoren? 3 / 27

Was sind Metaklassen? 4 / 27

Was sind Metaklassen Was sind Metaklassen? Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you don t (the people who actually need them know with certainty that they need them, and don t need an explanation about why). Python Guru Tim Peters 5 / 27

Was sind Metaklassen Was sind Metaklassen? Ich glaube, es ist nicht ganz so schlimm... 99% Prozent brauchen keine Metaklassen, sie können aber helfen, Probleme auf einfachere Art zu lösen 6 / 27

Was sind Metaklassen Also... was sind Metaklassen? Klassen in Python sind auch nur Objekte also Instanz einer Klasse Die Klasse von Klassen ist type 7 / 27

Was sind Metaklassen >>> class Foo(object):... pass >>> foo = Foo() >>> foo < main.foo object at 0x1005b5b90> >>> foo. class <class main.foo > >>> foo. class. class <type type > 8 / 27

Was sind Metaklassen Die Klasse einer Benutzerdefinierten Klasse ist also type Wenn eine Klasse auch nur die Instanz einer anderen (Meta-)Klasse ist, so kann ich auch die Metaklasse benutzen, um eine Klasse zu erzeugen. 9 / 27

# define a class the normal way class Foo: default = 42 def get_answer(self): return self.default # define a class as object from type type def _Bar_get_answer(self): return self.default Bar = type( Bar, (), { default : 42, get_answer : _Bar_get_answer, }) 10 / 27

Was sind Metaklassen uns das ist auch genau das, was intern passiert Python benutzt nach dem Parsen des class statements type um die Klasse zu erzeugen. Das lässt sich über das Attribute metaclass in der Klasse oder im Modul ändern Es reicht, wenn metaclass in einer Basis Klasse deklariert wird Hinweis: In grossen Projekten immer alles von einer (auch gerne leeren) Basisklasse ableiten 11 / 27

class Foo(object): answer = 42 # ist gleichwertig zu class Foo(object): metaclass = type answer = 42 # ist (fast) gleichwertig zu class MetaClass(type): pass class Foo(object): metaclass = MetaClass answer = 42 12 / 27

Wie implementiert man eine Metaklasse Wie jede andere Klasse auch üblichwerweise definiert man die init oder die new Methode um seinen code unterzubringen. new scheint mir angebrachter, da es der frühest mögliche Zeitpunkt ist 13 / 27

class ExampleMetaClass(type): def new (cls, name, bases, attributes): res = type(name, bases, attributes) print class %s created: %s % (name, res) return res class Foo(object): metaclass = ExampleMetaClass def init (self): return class Foo created: <class main.foo > 14 / 27

Wie implementiert man eine Metaklasse In dieser new Methode kann man nun anfangen, die Klasse zu manipulieren... oder zu analysieren 15 / 27

Beispiele 16 / 27

Wo benutzt man Metaklassen Wo benutzt man Metaklassen? Typischerweise bei Implemenationen von Interfaces ORM Mapper (django) Sprachmodifikationen (schlechter Ruf?) Debugging,... 17 / 27

Debugging mit Metaklassen: trace Das Problem Software wird an Kunden ausgeliefert. Falls es Probleme geben sollte, wünscht sich der Entwickler ausgiebige trace Informationen. Standard Lösung logging.debug calls, überall wo es sinnvoll sein könnte Grenzen der Lösung Debug Aufrufe kosten Rechenzeit Es ist nicht immer vorher klar, was sinnvoll ist Der Code wird durch debug Informationen unterbrochen und ist dadurch nicht so flüssig zu lesen 18 / 27

Debugging mit Metaklassen: trace Wunschlösung bei Nichtbenutzung, keine Laufzeiteinflüsse selektives tracen von allen Methoden aufrufen und Ergebnissen im Programm Kunde kann Problem mit eingeschaltetem Debug reproduzieren und aussagekräftige Logs an die Entwickeler schicken 19 / 27

Debugging mit Metaklassen: trace Idee: mittels config file / environment variable können beim Programmstart interessante Klassen/Methoden-namen angegeben werden eine Metaklasse dekoriert alle diese Methoden mit einem trace Dekorator 20 / 27

Debugging mit Metaklassen: trace class BaseMetaClass(type): def init (self, clsname, bases, attr): for name, value in attr.items(): if name.startswith( ): continue fullname = "%s.%s.%s" % ( self. module, clsname, name) if not should_wrap(fullname): continue value = trace_decorator(fullname, value) setattr(self, name, value) class BaseClass(object): metaclass = BaseMetaClass 21 / 27

Debugging mit Metaklassen: trace import os import fnmatch DEBUG_TARGETS = os.environ.get( DEBUG_TARGETS, ) def should_wrap(fullname): for pattern in DEBUG_TARGETS.split(, ): if fnmatch.fnmatch(fullname, pattern): return True return False 22 / 27

Debugging mit Metaklassen: trace def log(message, *args): print message % args def trace_decorator(fullname, method): def wrapper(*args, **kwargs): log("%s CALL %s %s", fullname, args, kwargs) try: res = method(*args, **kwargs) log("%s RETURN %s", fullname, res) return res except Exception,e: log("%s EXCEPTION %s", fullname, str(e)) raise #... return wrapper 23 / 27

Debugging mit Metaklassen: trace Anwendung $ DEBUG_TARGETS= $./metaclass_debug_usage.py $ DEBUG_TARGETS=*.Question.* $./metaclass_debug_usage.py main.question.set_answer CALL (< main.question object at 0x102cb1ad0>, 23 main.question.set_answer RETURN None 24 / 27

Andere Anwendungen Andere Anwendungen von Metaklassen Dynamische Code Analyse Callgraph Von wo wird auf eine Variable lesend/schreibend zugegriffen Coding Style enforcement fault injection 25 / 27

Weiterführendes Hintergrundinformationen http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python http://www.ibm.com/developerworks/linux/library/l-pymeta/index.html http://cleverdevil.org/computing/78/ Beispielcode https://github.com/mirkodziadzka/pycon-meta Folien als PDF http://mirko.dziadzka.de/vortrag/pycon-meta-20121030 26 / 27

Danke für s zuhören Fragen? 27 / 27