SlideShare ist ein Scribd-Unternehmen logo
1 von 48
Design patterns in Python ,[object Object]
Who I am ,[object Object]
ME (1993, U of  Auckland) mechanical engineering – control systems
Freelance developer (mainly C++, now Python)
Based at Hikutaia
Row Pro (digitalrowing.com) since 2001
Interest in software is primarily for modelling and simulation
PhD candidate at U of A (FEA horse's hoof, FORTRAN, Perl) thesis submitted Hikutaia
Outline ,[object Object]
General software design / pattern concepts (brief)
Specific examples of “Gang of Four” patterns in Python
Motivation “ 16 of 23 [GoF] patterns have a qualitatively simpler implementation in Lisp or Dylan than in C++, for at least some uses of each pattern” Peter Norvig (http://norvig.com/design-patterns/) “ Patterns are not needed in Python because design patterns are a sign of a deficiency of a language” … ... for the purpose that the design pattern addresses. How is observer implemented in Python?  (equivalent to Boost.Signals, Qt Slot/Signals, .NET events)  Coming from C++ or Java, if you already know the GoF patterns then it would be informative to see how they are implemented in Python. This talk documents part of my journey from C++ to Ptyhon.
Software vs Engineering design Physical construction – E.g. building a house Software construction The code is the design! “ Software may be cheap to build, but it is incredibly expensive to design” J W Reeves, What Is Software Design?, www.developerdotstar.com  Design stage output
Software design How does one design software, compared to physical engineering design? Data + algorithms? - only a part of the solution  Structure and Interpretation of Computer Programs. H Abelson, G Sussman, J Sussman.  http://mitpress.mit.edu/sicp/full-text/book/book.html Software Design Concepts (wikipedia) Abstraction – categorize and group concepts Refinement – convert high level to program statements Modularity – isolate independent features Software architecture – overall structure of the software Control Hierarchy – program structure Structural partitioning – horizontal vs vertical ? Data structure – logical relationship among elements Software procedure – an operation within a module Information hiding -  information contained within a module is inaccessible to others Not especially helpful - too abstract!
Object Oriented Design principles ,[object Object]
Encapsulation – information hiding ,[object Object],[object Object]
Abstractions should not depend on details. Details should depend on abstractions.
Loose coupling ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],http://www.oodesign.com/design-principles.html
What is a design pattern? ,[object Object]
Christopher Alexander - Architect
Patterns are discovered – not invented
Patterns are not independent from the programming language. Example: subroutines in assembler. Gamma, Helm, Johnson, Vlissades (1995): Design patterns: elements of reusable object oriented software. Addison Wesley.
Pattern classes Purpose Creational Structural Behavioural Scope Class Factory Method Adapter (class) Interpreter Template Method Object Abstract factory Builder Prototype Singleton Adapter (object) Bridge Composite Decorator Facade Flyweight Proxy Chain of responsibility Command Iterator Mediator Memento Observer State Strategy Visitor Gamma, Helm, Johnson, Vlissades (1995): Design patterns: elements of reusable object oriented software. Addison Wesley. Invisible or simplified in Python due to:  first class types   first class functions  other Fixed at compile time Can change at runtime Object creation Compostion of classes or objects Class and object interactions
Why are they invisible/ simplified? ,[object Object]
Python has ,[object Object]
First class* functions ,[object Object]
can be passed as a parameter to a subroutine
can be returned as the result of a subroutine
can be constructed at run-time
has intrinsic identity (independent of any given name) ,[object Object],[object Object]
Why are they invisible/simplified? (2) ,[object Object]
Wikipedia: In computer programming with object-oriented programming languages, duck typing is a style of dynamic typing in which an object's current set of methods and properties determines the valid semantics, rather than its inheritance from a particular class or implementation of a specific interface. ,[object Object]
This means that a base class is not always needed
Therefore a lot of infrastructure code can be avoided
Why are they invisible/simplified? (3) ,[object Object]
When to use a class ,[object Object]
If you need to do something special. E.g. # Put in const.py...: class   _const : class   ConstError (TypeError):  pass def   __setattr__ ( self ,name,value): if   self .__dict__.has_key(name): raise   self .ConstError,  "Can't  rebind   const (%s)" %name self .__dict__[name]=value import  sys sys.modules[__name__]=_const() # that's all -- now any client-code can import  const # and bind an attribute ONCE: const.magic =  23 # but NOT re-bind it: const.magic =  88   # raises const.ConstError # you may also want to add the obvious __delattr__ Alex Martelli http://code.activestate.com/recipes/65207-constants-in-python/
Iterator – built in ,[object Object],class   Sequence : def   __init__ ( self , size): self .list = [x  for  x  in  xrange(size)] self .index =  0 def   __iter__ ( self ): return   self def   next ( self ): if  len( self .list) ==  self .index: raise  StopIteration current =  self .list[ self .index] self .index +=  1 return  current >>> a = Sequence( 3 ) >>>  for  x  in  a: print  x 0 1 2 >>>  http://www.dofactory.com/Patterns/PatternIterator.aspx
Command ,[object Object]
Known uses: undo/redo.
OO replacement for callbacks.
Specify, queue and execute requests at different times. http://www.cs.mcgill.ca/~hv/classes/CS400/01.hchen/doc/command/command.html
Command – GoF style Rahul Verma, Chetan Giridhar. Design Patterns in Python. www.testingperspective.com  class   Command : """The Command Abstract class""" def   __init__ ( self ): pass #Make changes  def   execute ( self ): #OVERRIDE raise  NotImplementedError class   FlipUpCommand (Command): """The Command class for turning on the light""" def   __init__ ( self , light): self .__light = light def   execute ( self ): self .__light.turnOn()
Command in Python def   greet (who): print   "Hello %s"  % who greet_command =  lambda : greet( "World" ) # pass the  callable  around, and invoke it later greet_command() class   MoveFileCommand (object): def   __init__ ( self , src, dest): self .src = src self .dest = dest self () def   __call__ ( self ): os.rename( self .src,  self .dest) def   undo ( self ): os.rename( self .dest,  self .src) undo_stack = [] undo_stack.append(MoveFileCommand( 'foo.txt' ,  'bar.txt' )) undo_stack.append(MoveFileCommand( 'bar.txt' ,  'baz.txt' )) # foo.txt is now renamed to baz.txt undo_stack.pop().undo()  # Now it's bar.txt undo_stack.pop().undo()  # and back to foo.txt  http://stackoverflow.com/questions/1494442/general-command-pattern-and-command-dispatch-pattern-in-python  (Ants Aasma) Simple case: Just use a callable More complex case: Use a command object but no need for a base class
Singleton ,[object Object]
makes you seem stupid
it's global
creates very strong coupling with client classes http://en.csharp-online.net

Weitere ähnliche Inhalte

Was ist angesagt?

14 file handling
14 file handling14 file handling
14 file handlingAPU
 
Jdbc architecture and driver types ppt
Jdbc architecture and driver types pptJdbc architecture and driver types ppt
Jdbc architecture and driver types pptkamal kotecha
 
Python – Object Oriented Programming
Python – Object Oriented Programming Python – Object Oriented Programming
Python – Object Oriented Programming Raghunath A
 
Object oriented programming with python
Object oriented programming with pythonObject oriented programming with python
Object oriented programming with pythonArslan Arshad
 
Java class,object,method introduction
Java class,object,method introductionJava class,object,method introduction
Java class,object,method introductionSohanur63
 
Python and CSV Connectivity
Python and CSV ConnectivityPython and CSV Connectivity
Python and CSV ConnectivityNeeru Mittal
 
PYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYA
PYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYAPYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYA
PYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYAMaulik Borsaniya
 
Exception Handling in JAVA
Exception Handling in JAVAException Handling in JAVA
Exception Handling in JAVASURIT DATTA
 
Explain Delegates step by step.
Explain Delegates step by step.Explain Delegates step by step.
Explain Delegates step by step.Questpond
 
Python Variable Types, List, Tuple, Dictionary
Python Variable Types, List, Tuple, DictionaryPython Variable Types, List, Tuple, Dictionary
Python Variable Types, List, Tuple, DictionarySoba Arjun
 
Python Course | Python Programming | Python Tutorial | Python Training | Edureka
Python Course | Python Programming | Python Tutorial | Python Training | EdurekaPython Course | Python Programming | Python Tutorial | Python Training | Edureka
Python Course | Python Programming | Python Tutorial | Python Training | EdurekaEdureka!
 
python Function
python Function python Function
python Function Ronak Rathi
 

Was ist angesagt? (20)

14 file handling
14 file handling14 file handling
14 file handling
 
Functions in Python
Functions in PythonFunctions in Python
Functions in Python
 
Python : Functions
Python : FunctionsPython : Functions
Python : Functions
 
Jdbc architecture and driver types ppt
Jdbc architecture and driver types pptJdbc architecture and driver types ppt
Jdbc architecture and driver types ppt
 
Python – Object Oriented Programming
Python – Object Oriented Programming Python – Object Oriented Programming
Python – Object Oriented Programming
 
Object oriented programming with python
Object oriented programming with pythonObject oriented programming with python
Object oriented programming with python
 
Github basics
Github basicsGithub basics
Github basics
 
Python
PythonPython
Python
 
C# Delegates
C# DelegatesC# Delegates
C# Delegates
 
Java class,object,method introduction
Java class,object,method introductionJava class,object,method introduction
Java class,object,method introduction
 
Python and CSV Connectivity
Python and CSV ConnectivityPython and CSV Connectivity
Python and CSV Connectivity
 
PYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYA
PYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYAPYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYA
PYTHON-Chapter 3-Classes and Object-oriented Programming: MAULIK BORSANIYA
 
Chapter 05 classes and objects
Chapter 05 classes and objectsChapter 05 classes and objects
Chapter 05 classes and objects
 
Exception Handling in JAVA
Exception Handling in JAVAException Handling in JAVA
Exception Handling in JAVA
 
Explain Delegates step by step.
Explain Delegates step by step.Explain Delegates step by step.
Explain Delegates step by step.
 
Python Variable Types, List, Tuple, Dictionary
Python Variable Types, List, Tuple, DictionaryPython Variable Types, List, Tuple, Dictionary
Python Variable Types, List, Tuple, Dictionary
 
Python Course | Python Programming | Python Tutorial | Python Training | Edureka
Python Course | Python Programming | Python Tutorial | Python Training | EdurekaPython Course | Python Programming | Python Tutorial | Python Training | Edureka
Python Course | Python Programming | Python Tutorial | Python Training | Edureka
 
Python: Polymorphism
Python: PolymorphismPython: Polymorphism
Python: Polymorphism
 
Java keywords
Java keywordsJava keywords
Java keywords
 
python Function
python Function python Function
python Function
 

Ähnlich wie Patterns in Python

Introduction to c_plus_plus
Introduction to c_plus_plusIntroduction to c_plus_plus
Introduction to c_plus_plusSayed Ahmed
 
Introduction to c_plus_plus (6)
Introduction to c_plus_plus (6)Introduction to c_plus_plus (6)
Introduction to c_plus_plus (6)Sayed Ahmed
 
P Training Presentation
P Training PresentationP Training Presentation
P Training PresentationGaurav Tyagi
 
Concepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming LanguagesConcepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming Languagesppd1961
 
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018Steven Smith
 
chapter 5 Objectdesign.ppt
chapter 5 Objectdesign.pptchapter 5 Objectdesign.ppt
chapter 5 Objectdesign.pptTemesgenAzezew
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalystdwm042
 
Framework engineering JCO 2011
Framework engineering JCO 2011Framework engineering JCO 2011
Framework engineering JCO 2011YoungSu Son
 
4 pillars of OOPS CONCEPT
4 pillars of OOPS CONCEPT4 pillars of OOPS CONCEPT
4 pillars of OOPS CONCEPTAjay Chimmani
 
OOP-Advanced Programming with c++
OOP-Advanced Programming with c++OOP-Advanced Programming with c++
OOP-Advanced Programming with c++Mohamed Essam
 
Understanding And Using Reflection
Understanding And Using ReflectionUnderstanding And Using Reflection
Understanding And Using ReflectionGanesh Samarthyam
 

Ähnlich wie Patterns in Python (20)

Introduction to c_plus_plus
Introduction to c_plus_plusIntroduction to c_plus_plus
Introduction to c_plus_plus
 
Introduction to c_plus_plus (6)
Introduction to c_plus_plus (6)Introduction to c_plus_plus (6)
Introduction to c_plus_plus (6)
 
P Training Presentation
P Training PresentationP Training Presentation
P Training Presentation
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Concepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming LanguagesConcepts In Object Oriented Programming Languages
Concepts In Object Oriented Programming Languages
 
Modern C++
Modern C++Modern C++
Modern C++
 
Andy On Closures
Andy On ClosuresAndy On Closures
Andy On Closures
 
Csci360 20 (1)
Csci360 20 (1)Csci360 20 (1)
Csci360 20 (1)
 
Csci360 20
Csci360 20Csci360 20
Csci360 20
 
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
Design Pattern Mastery - Momentum Dev Con 19 Apr 2018
 
chapter 5 Objectdesign.ppt
chapter 5 Objectdesign.pptchapter 5 Objectdesign.ppt
chapter 5 Objectdesign.ppt
 
Practical catalyst
Practical catalystPractical catalyst
Practical catalyst
 
Unit 1
Unit  1Unit  1
Unit 1
 
Framework engineering JCO 2011
Framework engineering JCO 2011Framework engineering JCO 2011
Framework engineering JCO 2011
 
ProgrammingPrimerAndOOPS
ProgrammingPrimerAndOOPSProgrammingPrimerAndOOPS
ProgrammingPrimerAndOOPS
 
4 pillars of OOPS CONCEPT
4 pillars of OOPS CONCEPT4 pillars of OOPS CONCEPT
4 pillars of OOPS CONCEPT
 
OOP-Advanced Programming with c++
OOP-Advanced Programming with c++OOP-Advanced Programming with c++
OOP-Advanced Programming with c++
 
Understanding And Using Reflection
Understanding And Using ReflectionUnderstanding And Using Reflection
Understanding And Using Reflection
 
Bp301
Bp301Bp301
Bp301
 

Mehr von dn

Code quality; patch quality
Code quality; patch qualityCode quality; patch quality
Code quality; patch qualitydn
 
How does this code work?
How does this code work?How does this code work?
How does this code work?dn
 
Python worst practices
Python worst practicesPython worst practices
Python worst practicesdn
 
Struggling to find an open source business model
Struggling to find an open source business modelStruggling to find an open source business model
Struggling to find an open source business modeldn
 
Testing in those hard to reach places
Testing in those hard to reach placesTesting in those hard to reach places
Testing in those hard to reach placesdn
 
Automated testing in Python and beyond
Automated testing in Python and beyondAutomated testing in Python and beyond
Automated testing in Python and beyonddn
 
Behaviour Driven Development and Thinking About Testing
Behaviour Driven Development and Thinking About TestingBehaviour Driven Development and Thinking About Testing
Behaviour Driven Development and Thinking About Testingdn
 
Spotlight on Python
Spotlight on PythonSpotlight on Python
Spotlight on Pythondn
 

Mehr von dn (8)

Code quality; patch quality
Code quality; patch qualityCode quality; patch quality
Code quality; patch quality
 
How does this code work?
How does this code work?How does this code work?
How does this code work?
 
Python worst practices
Python worst practicesPython worst practices
Python worst practices
 
Struggling to find an open source business model
Struggling to find an open source business modelStruggling to find an open source business model
Struggling to find an open source business model
 
Testing in those hard to reach places
Testing in those hard to reach placesTesting in those hard to reach places
Testing in those hard to reach places
 
Automated testing in Python and beyond
Automated testing in Python and beyondAutomated testing in Python and beyond
Automated testing in Python and beyond
 
Behaviour Driven Development and Thinking About Testing
Behaviour Driven Development and Thinking About TestingBehaviour Driven Development and Thinking About Testing
Behaviour Driven Development and Thinking About Testing
 
Spotlight on Python
Spotlight on PythonSpotlight on Python
Spotlight on Python
 

Kürzlich hochgeladen

"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 

Kürzlich hochgeladen (20)

"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 

Patterns in Python

  • 1.
  • 2.
  • 3. ME (1993, U of Auckland) mechanical engineering – control systems
  • 4. Freelance developer (mainly C++, now Python)
  • 7. Interest in software is primarily for modelling and simulation
  • 8. PhD candidate at U of A (FEA horse's hoof, FORTRAN, Perl) thesis submitted Hikutaia
  • 9.
  • 10. General software design / pattern concepts (brief)
  • 11. Specific examples of “Gang of Four” patterns in Python
  • 12. Motivation “ 16 of 23 [GoF] patterns have a qualitatively simpler implementation in Lisp or Dylan than in C++, for at least some uses of each pattern” Peter Norvig (http://norvig.com/design-patterns/) “ Patterns are not needed in Python because design patterns are a sign of a deficiency of a language” … ... for the purpose that the design pattern addresses. How is observer implemented in Python? (equivalent to Boost.Signals, Qt Slot/Signals, .NET events) Coming from C++ or Java, if you already know the GoF patterns then it would be informative to see how they are implemented in Python. This talk documents part of my journey from C++ to Ptyhon.
  • 13. Software vs Engineering design Physical construction – E.g. building a house Software construction The code is the design! “ Software may be cheap to build, but it is incredibly expensive to design” J W Reeves, What Is Software Design?, www.developerdotstar.com Design stage output
  • 14. Software design How does one design software, compared to physical engineering design? Data + algorithms? - only a part of the solution Structure and Interpretation of Computer Programs. H Abelson, G Sussman, J Sussman. http://mitpress.mit.edu/sicp/full-text/book/book.html Software Design Concepts (wikipedia) Abstraction – categorize and group concepts Refinement – convert high level to program statements Modularity – isolate independent features Software architecture – overall structure of the software Control Hierarchy – program structure Structural partitioning – horizontal vs vertical ? Data structure – logical relationship among elements Software procedure – an operation within a module Information hiding - information contained within a module is inaccessible to others Not especially helpful - too abstract!
  • 15.
  • 16.
  • 17. Abstractions should not depend on details. Details should depend on abstractions.
  • 18.
  • 19.
  • 21. Patterns are discovered – not invented
  • 22. Patterns are not independent from the programming language. Example: subroutines in assembler. Gamma, Helm, Johnson, Vlissades (1995): Design patterns: elements of reusable object oriented software. Addison Wesley.
  • 23. Pattern classes Purpose Creational Structural Behavioural Scope Class Factory Method Adapter (class) Interpreter Template Method Object Abstract factory Builder Prototype Singleton Adapter (object) Bridge Composite Decorator Facade Flyweight Proxy Chain of responsibility Command Iterator Mediator Memento Observer State Strategy Visitor Gamma, Helm, Johnson, Vlissades (1995): Design patterns: elements of reusable object oriented software. Addison Wesley. Invisible or simplified in Python due to: first class types first class functions other Fixed at compile time Can change at runtime Object creation Compostion of classes or objects Class and object interactions
  • 24.
  • 25.
  • 26.
  • 27. can be passed as a parameter to a subroutine
  • 28. can be returned as the result of a subroutine
  • 29. can be constructed at run-time
  • 30.
  • 31.
  • 32.
  • 33. This means that a base class is not always needed
  • 34. Therefore a lot of infrastructure code can be avoided
  • 35.
  • 36.
  • 37. If you need to do something special. E.g. # Put in const.py...: class _const : class ConstError (TypeError): pass def __setattr__ ( self ,name,value): if self .__dict__.has_key(name): raise self .ConstError, "Can't rebind const (%s)" %name self .__dict__[name]=value import sys sys.modules[__name__]=_const() # that's all -- now any client-code can import const # and bind an attribute ONCE: const.magic = 23 # but NOT re-bind it: const.magic = 88 # raises const.ConstError # you may also want to add the obvious __delattr__ Alex Martelli http://code.activestate.com/recipes/65207-constants-in-python/
  • 38.
  • 39.
  • 41. OO replacement for callbacks.
  • 42. Specify, queue and execute requests at different times. http://www.cs.mcgill.ca/~hv/classes/CS400/01.hchen/doc/command/command.html
  • 43. Command – GoF style Rahul Verma, Chetan Giridhar. Design Patterns in Python. www.testingperspective.com class Command : """The Command Abstract class""" def __init__ ( self ): pass #Make changes def execute ( self ): #OVERRIDE raise NotImplementedError class FlipUpCommand (Command): """The Command class for turning on the light""" def __init__ ( self , light): self .__light = light def execute ( self ): self .__light.turnOn()
  • 44. Command in Python def greet (who): print "Hello %s" % who greet_command = lambda : greet( "World" ) # pass the callable around, and invoke it later greet_command() class MoveFileCommand (object): def __init__ ( self , src, dest): self .src = src self .dest = dest self () def __call__ ( self ): os.rename( self .src, self .dest) def undo ( self ): os.rename( self .dest, self .src) undo_stack = [] undo_stack.append(MoveFileCommand( 'foo.txt' , 'bar.txt' )) undo_stack.append(MoveFileCommand( 'bar.txt' , 'baz.txt' )) # foo.txt is now renamed to baz.txt undo_stack.pop().undo() # Now it's bar.txt undo_stack.pop().undo() # and back to foo.txt http://stackoverflow.com/questions/1494442/general-command-pattern-and-command-dispatch-pattern-in-python (Ants Aasma) Simple case: Just use a callable More complex case: Use a command object but no need for a base class
  • 45.
  • 46. makes you seem stupid
  • 48. creates very strong coupling with client classes http://en.csharp-online.net
  • 49. Singleton GoF style http://code.activestate.com/recipes/52558-the-singleton-pattern-implemented-with-python/ class Singleton : class __impl : """ Implementation of the singleton interface """ def spam ( self ): """ Test method, return singleton id """ return id( self ) # storage for the instance reference __instance = None def __init__ ( self ): """ Create singleton instance """ # Check whether we already have an instance if Singleton.__instance is None : # Create and remember instance Singleton.__instance = Singleton.__impl() # Store instance reference as the only member in the handle self .__dict__[ '_Singleton__instance' ] = Singleton.__instance def __getattr__ ( self , attr): """ Delegate access to implementation """ return getattr( self .__instance, attr) def __setattr__ ( self , attr, value): return setattr( self .__instance, attr, value)
  • 50.
  • 51.
  • 52.
  • 53. Strategy - statically typed class Bisection (FindMinima): def algorithm ( self ,line): Return ( 5.5 , 6.6 ) class ConjugateGradient (FindMinima): def algorithm ( self ,line): Return ( 3.3 , 4.4 ) class MinimaSolver : # context class strategy= '' def __init__ ( self ,strategy): self .strategy=strategy def minima ( self ,line): return self .strategy.algorithm(line) def changeAlgorithm ( self , newAlgorithm): self .strategy = newAlgorithm def test (): solver=MinimaSolver(ConjugateGradient()) print solver.minima(( 5.5 , 5.5 )) solver.changeAlgorithm(Bisection()) print solver.minima(( 5.5 , 5.5 )) From J Gregorio http://assets.en.oreilly.com/1/event/12/_The%20Lack%20of_%20Design%20Patterns%20in%20Python%20Presentation.pdf
  • 54. Strategy in Python def bisection (line): Return 5.5 , 6.6 def conjugate_gradient (line): Return 3.3 , 4.4 def test (): solver = conjugate_gradient print solver(( 5.5 , 5.5 )) solver = bisection print solver(( 5.5 , 5.5 )) From J Gregorio http://assets.en.oreilly.com/1/event/12/_The%20Lack%20of_%20Design%20Patterns%20in%20Python%20Presentation.pdf Invisible because Python has first class functions
  • 55.
  • 56. Known uses: model – view – controller, Qt Signals/Slots, Boost.Signals, most GUI toolkits http://en.wikipedia.org/wiki/File:Observer.svg
  • 57.
  • 59. Pass parameters to the observer e.g. http://code.activestate.com/recipes/131499-observer-pattern/
  • 60.
  • 61.
  • 62. Not the same as Python decorators Objects enclose other objects that share similar interfaces. The decorating object appears to mask or modify or annotate the enclosed object. http://en.wikipedia.org/wiki/File:Decorator_UML_class_diagram.svg
  • 63. Decorator GoF style class Writer (object): def write ( self , s): print s class WriterDecorator (object): def __init__ ( self , wrappee): self .wrappee = wrappee def write ( self , s): self .wrappee.write(s) class UpperWriter (WriterDecorator): def write ( self , s): self .wrappee.write(s.upper()) class ShoutWriter (WriterDecorator): def write ( self , s): self .wrappee.write( '!' .join( [t for t in s.split( ' ' ) if t]) + '!' ) Magnus Therning http://therning.org/magnus/archives/301 w = Writer() w.write( 'hello' ) uw = UpperWriter(w) uw.write( 'hello' ) wd = WriterDecorator(w) wd.write( 'hello' ) sw1 = ShoutWriter(w) sw1.write( 'hello again' ) sw2 = ShoutWriter(uw) sw2.write( 'hello again' ) >>> hello HELLO hello hello!again! HELLO!AGAIN!
  • 64. Decorator using function decorators def uppercase (f): def wrapper (*args, **kwargs): orig = f(*args, **kwargs) return orig.upper() return wrapper def shout (f): def wrapper (*args, **kwargs): orig = f(*args, **kwargs) return '!' .join( [t for t in orig.split( ' ' ) if t]) + '!' return wrapper @shout def s_writer (s): return s print s_writer( "hello again" ) @shout @uppercase def su_writer (s): return s print su_writer( "hello again" ) >>> HELLO AGAIN HELLO!AGAIN!
  • 65. Decorator using delegation import string class UpSeq : def __init__ ( self , seqobj): self .seqobj = seqobj def __str__ ( self ): return string.upper( self .seqobj.seq) def __getattr__ ( self ,attr): return getattr( self .seqobj, attr) class DNA (): def __init__ ( self , name, seq): self .seq = seq self .name = name def __getitem__ ( self , item): return self .seq.__getitem__(item) def first ( self ): return self .seq[ 0 ] s=UpSeq(DNA(name= '1' , seq= ' atcgctgtc ' )) >>> print s ATCGCTGTC >>> print s[ 0 : 3 ] atc >>> print s.first() a Adapted from http://www.pasteur.fr/formation/infobio/python/ UpSeq delegates to DNA
  • 66.
  • 68. Known uses: TCP, GUIs http://en.wikipedia.org/wiki/File:State_Design_Pattern_UML_Class_Diagram.svg
  • 69. State GoF style class State(object): """Base state. This is to share functionality""" def scan( self ): """Scan the dial to the next station""" self .pos += 1 if self .pos == len( self .stations): self .pos = 0 print "Scanning… Station is" , self .stations[ self .pos], self .name class AmState(State): def __init__( self , radio): self .radio = radio self .stations = [ "1250" , "1380" , "1510" ] self .pos = 0 self .name = "AM" def toggle_amfm( self ): print "Switching to FM" self .radio.state = self .radio.fmstate class FmState(State): def __init__( self , radio): self .radio = radio self .stations = [ "81.3" , "89.1" , "103.9" ] self .pos = 0 self .name = "FM" def toggle_amfm( self ): print "Switching to AM" self .radio.state = self .radio.amstate class Radio(object): """A radio. It has a scan button, and an AM/FM toggle switch.""" def __init__( self ): """We have an AM state and an FM state""" self .amstate = AmState( self ) self .fmstate = FmState( self ) self .state = self .amstate def toggle_amfm( self ): self .state.toggle_amfm() def scan( self ): self .state.scan() # Test radio = Radio() actions = [radio.scan] * 2 + [radio.toggle_amfm] + [radio.scan] * 2 actions = actions * 2 for action in actions: action() Jeff ? http://ginstrom.com/scribbles/2007/10/08/design-patterns-python-style/ Scanning... Station is 1380 AM Scanning... Station is 1510 AM Switching to FM Scanning... Station is 89.1 FM Scanning... Station is 103.9 FM Scanning... Station is 81.3 FM Scanning... Station is 89.1 FM Switching to AM Scanning... Station is 1250 AM Scanning... Station is 1380 AM Note lack of state methods “Abstract” state Context Concrete states
  • 70.
  • 71. State in Python (method) class Sequencer(): def __init__( self ): self ._action_impl = self .action1 self .count = 1 def action( self ): self ._action_impl() def next( self ): self .count += 1 if self .count > 3 : self .count = 1 self ._action_impl = getattr( self , "action" +str( self .count)) def action1( self ): print "1" def action2( self ): print "2" def action3( self ): print "3" s = Sequencer() actions = [s.action] + [s.next] actions = actions * 3 for f in actions: f() >>> 1 2 3 >>> Switch methods output Use Bridge so that the binding of Sequencer.action doesn't change
  • 72. State in Python (class) >>> First 1 Second 2 Third 3 First 4 First 1 Second 2 Second 3 class Base (): def __init__ ( self ): self .state = 0 def action ( self ): self .state += 1 print self .__class__.__name__, self .state def change_state ( self , next_class): self .__class__ = next_class class Third (Base): def transition ( self ): self .change_state( First ) class Second (Base): def transition ( self ): self .change_state( Third ) class First (Base): def transition ( self ): self .change_state( Second ) state = First() state.action() state.transition() state.action() state.transition() state.action() state.transition() state.action() state = First() actions = [state.action] + [state.transition] actions = actions * 3 for action in actions: action() output This doesn't work because state is always First
  • 73.
  • 74. Strategy is behavioural – interchange algorithms
  • 75. Bridge is structural – implementation varies independently from abstraction
  • 77.
  • 78. Factory Method GOF style class Person : def __init__ ( self ): self .name = None self .gender = None def getName ( self ): return self .name def getGender ( self ): return self .gender class Male (Person): def __init__ ( self , name): print "Hello Mr." + name class Female (Person): def __init__ ( self , name): print "Hello Miss." + name class Factory : def getPerson ( self , name, gender): if gender == 'M' : return Male(name) if gender == 'F' : return Female(name) From: dpip.testingperspective.com factory = Factory() person = factory.getPerson( " Chetan " , "M" ) person = factory.getPerson( " Money " , "F" ) >>> Hello Mr.Chetan Hello Miss.Money
  • 79. Factory method in Python class Male (object): def __init__ ( self , name): print "Hello Mr." + name class Female (object): def __init__ ( self , name): print "Hello Ms." + name factory = dict(F=Female, M=Male) if __name__ == '__main__' : person = factory[ "F" ]( "Money" ) person = factory[ "M" ]( " Powers " ) >>> Hello Ms.Money Hello Mr.Powers Adapted from: http://www.rmi.net/~lutz/talk.html # variable length arg lists def factory (aClass, *args, **kwargs): return aClass(*args, **kwargs) class Spam : def __init__ ( self ): print self .__class__.__name__ def doit ( self , message): print message class Person : def __init__ ( self , name, job): self .name = name self .job = job print self .__class__.__name__, name, job object1 = factory(Spam) object2 = factory(Person, " Guido " , "guru" ) >>> Spam Person Guido guru
  • 80.
  • 81. Abstract Factory GoF style class PetShop : def __init__ ( self , animal_factory= None ): """pet_factory is our abstract factory. We can set it at will.""" self .pet_factory = animal_factory def show_pet ( self ): """Creates and shows a pet using the abstract factory""" pet = self .pet_factory.get_pet() print "This is a lovely" , pet print "It says" , pet.speak() print "It eats" , self .pet_factory.get_food() class Dog : def speak ( self ): return "woof" def __str__ ( self ): return "Dog" class Cat : def speak ( self ): return " meow " def __str__ ( self ): return "Cat" http://ginstrom.com/scribbles/2007/10/08/design-patterns-python-style/ class DogFactory : def get_pet ( self ): return Dog() def get_food ( self ): return "dog food" class CatFactory : def get_pet ( self ): return Cat() def get_food ( self ): return "cat food" # Create the proper family def get_factory (): return random.choice([DogFactory, CatFactory])() # Show pets with various factories shop = PetShop() for i in range( 3 ): shop.pet_factory = get_factory() shop.show_pet() print "=" * 10 >>> This is a lovely Dog It says woof It eats dog food ========== This is a lovely Cat It says meow It eats cat food ========== This is a lovely Dog It says woof It eats dog food ==========
  • 82.
  • 83.
  • 84. Flyweight in Python http://codesnipers.com/?q=python-flyweights import weakref class Card (object): _CardPool = weakref.WeakValueDictionary() def __new__ (cls, value, suit): obj = Card._CardPool.get(value + suit, None ) if not obj: obj = object.__new__(cls) Card._CardPool[value + suit] = obj obj.value, obj.suit = value, suit return obj c1 = Card( '9' , 'h' ) c2 = Card( '9' , 'h' ) c3 = Card( '2' , 's' ) print c1 == c2, c1 == c3, c2 == c3 print id(c1), id(c2), id(c3) >>> True False False 38958096 38958096 38958128
  • 85.
  • 87.
  • 91.
  • 92. Duck typing – base classes may be optional
  • 93. Ability to override special methods
  • 94.
  • 95.

Hinweis der Redaktion

  1. Personal: needed an observer implementation in Python like Boost.Signal, initially couldn't find one. My engineering background lead me to search for generic design principles in software.
  2. Polymorphism
  3. Creational patterns: patterns that can be used to create objects. Structural patterns: patterns that can be used to combine objects and classes in order to build structured objects. Behavioral patterns: patterns that can be used to build a computation and to control data flows. Norvig: 16 of 23 patterns are either invisible or simpler, due to: First-class types (6): Abstract-Factory, Flyweight, Factory-Method, State, Proxy, Chain-Of-Responsibility First-class functions (4): Command, Strategy, Template-Method, Visitor Macros (2): Interpreter, Iterator Method Combination (2): Mediator, Observer Multimethods (1): Builder Modules (1): Facade