Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PyConZA 2013: "Python meta-classes" by Kisitu Augustine

7b0645f018c0bddc8ce3900ccc3ba70c?s=47 Pycon ZA
October 04, 2013

PyConZA 2013: "Python meta-classes" by Kisitu Augustine

An attempt to demystify meta classes and show what they are, what they do and when you might need them.

This talk is for anyone who would like to see what happens under the hood when you create a class in Python and how to intercept the class creation process and modify it.

7b0645f018c0bddc8ce3900ccc3ba70c?s=128

Pycon ZA

October 04, 2013
Tweet

Transcript

  1. Python  Meta  Classes   Kisitu  Augus)ne   So.ware  Developer  at

     ThoughtWorks   Twi:er:  @aus)ine04   Github:  aus)ine04  
  2. SOME  BASICS  

  3. Everything  is  an  object  in   python.  

  4. Classes  create  instances.         Class  Foo(object):  

             def  _  _init_  _(self,  bar):                  self.bar  =  bar             f  =  Foo(‘Alex  Bar’)  
  5. type(f)  

  6. Crea)ng  new  types        

  7. Class  Foo(object):          pass      

  8. Class  Foo:        pass    

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

  10. type(cls,*args,**kwargs)  

  11. type()  is  actually  not  a  func)on.       It

     is  a  META  CLASS.  
  12. A  special  kind  of  class  that  creates  classes.  

  13. type(name,  bases,  cls_dct)  

  14. Class  Foo(object):          def  _  _init_  _(self,

     bar):                    self.bar  =  bar       At  run)me  class  Foo  is  an  instance  of  type  
  15. De5ining  a  meta  class   class  Meta(type):      

         def  _  _init_  _(cls,  name,  bases,  dict):                  pass            def  _  _new_  _(meta,  name,  bases,  dct):                    pass                      def  _  _call_  _(cls,  *args,  **kwargs):                    pass  
  16. _  _new_  _()  vs    _  _init_  _()  

  17. class  Foo(object):          _  _metaclass_  _  =

     Meta                    def  _  _init_  _(self):                  pass    
  18. class  Foo(metaclass  =  Meta):            def

     _  _init_  _(self):                  pass    
  19. Show  us  the  code  

  20. Example      #1   Making  a  class  final  

     
  21. Example    #2   Decora)ng  class  methods  

  22. def  log(func)on):          def  wrapper_func)on(*args,  **kwargs):  

                   print  “Calling  ……….”,  func)on.__name__                  return  func)on(*args,  **kwargs)          return  wrapper_func)on  
  23. Some  advanced  basics  

  24. A  class  is  an  instance  of  its  metaclass  at  run)me.

     
  25.   Metaclasses  go  down  the  inheritance  chain.    

  26. Things  can  get  quite  ugly  if  you  are  inheri)ng  from

      mul)ple  classes  each  with  its  own  meta  class.  
  27. With  great  power  comes  great   responsibility  

  28. Questions  ???