Python Metaclasses

kisituaugustine 1,121 views 28 slides Oct 05, 2013
Slide 1
Slide 1 of 28
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28

About This Presentation

A talk i did at PyConZA 2013


Slide Content

Python Meta Classes Kisitu Augustine Software Developer at ThoughtWorks Twitter: @austiine04 Github : austiine04

SOME BASICS

Everything is an object in python.

Classes create instances. Class Foo( object): def _ _ init _ _(self, bar ) : self.bar = bar f = Foo(‘Alex Bar’ )

type( f )

Creating new types

Class Foo( object): pass

Class Foo: pass

Foo = type( ‘Foo’ , (), {})

type( cls ,* args ,* * kwargs )

type() is actually not a function. It is a META CLASS.

A special kind of class that creates classes.

type(name, bases, cls_dct )

Class Foo ( object): def _ _ init _ _(self, bar ) : self.bar = bar At runtime class Foo is an instance of type

Defining a meta class class Meta(type): d ef _ _ init _ _( cls , name, bases, dict ): pass def _ _new_ _(meta, name, bases, dct ): pass def _ _call_ _ ( cls , * args , ** kwargs ): pass *remember to call super in each of method you override

_ _new_ _() vs _ _ init _ _()

class Foo(object): _ _ metaclass _ _ = Meta def _ _ init _ _(self): pass

class Foo( metaclass = Meta): def _ _ init _ _(self): pass

Show us the code

Example #1 Making a class final

Example #2 Decorating class methods

def log( function): def wrapper_function ( * args , ** kwargs ): print “Calling ……….”, function .__name __ return function(* args , ** kwargs ) return wrapper_function

Some advanced basics

A class is an instance of its metaclass at runtime.

Metaclasses go down the inheritance chain.

Things can get quite ugly if you are inheriting from multiple classes each with its own meta class.

With great power comes great responsibility

Questions ???