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?

Was ist angesagt? (20)

Advance Java Topics (J2EE)
Advance Java Topics (J2EE)Advance Java Topics (J2EE)
Advance Java Topics (J2EE)
 
Java Collections Framework
Java Collections FrameworkJava Collections Framework
Java Collections Framework
 
Introduction to Design Pattern
Introduction to Design  PatternIntroduction to Design  Pattern
Introduction to Design Pattern
 
Python twisted
Python twistedPython twisted
Python twisted
 
Oop concepts in python
Oop concepts in pythonOop concepts in python
Oop concepts in python
 
Crud tutorial en
Crud tutorial enCrud tutorial en
Crud tutorial en
 
Python Seaborn Data Visualization
Python Seaborn Data Visualization Python Seaborn Data Visualization
Python Seaborn Data Visualization
 
Introduction to MongoDB and CRUD operations
Introduction to MongoDB and CRUD operationsIntroduction to MongoDB and CRUD operations
Introduction to MongoDB and CRUD operations
 
Core java kvr - satya
Core  java kvr - satyaCore  java kvr - satya
Core java kvr - satya
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Python sqlite3
Python sqlite3Python sqlite3
Python sqlite3
 
Method Overloading In Java
Method Overloading In JavaMethod Overloading In Java
Method Overloading In Java
 
Polymorphism In Java
Polymorphism In JavaPolymorphism In Java
Polymorphism In Java
 
Methods in Java
Methods in JavaMethods in Java
Methods in Java
 
Svelte JS introduction
Svelte JS introductionSvelte JS introduction
Svelte JS introduction
 
Hibernate Presentation
Hibernate  PresentationHibernate  Presentation
Hibernate Presentation
 
Collections - Maps
Collections - Maps Collections - Maps
Collections - Maps
 
Object oriented programming
Object oriented programmingObject oriented programming
Object oriented programming
 
JAVA PROGRAMMING
JAVA PROGRAMMING JAVA PROGRAMMING
JAVA PROGRAMMING
 
Java servlets
Java servletsJava servlets
Java servlets
 

Ä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

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 

Kürzlich hochgeladen (20)

Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 

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