Detailed Course Outline
Object-Oriented Programming in Python
- Extending classes to define subclasses
 - Inheriting from multiple superclasses and mix-in classes
 - Adding properties to a class
 - Defining abstract base classes
 
Exploring Python Features
Writing "Pythonic" code
- Customising iteration and indexing with "magic" methods
 - Modifying code dynamically with monkey patching
 
Handling Exceptions
- Raising user-defined exceptions
 - Reducing code complexity with context managers and the "with" statement
 
Verifying Code and Unit Testing
Testing best practices
- Developing and running Python unit tests
 - Simplifying automated testing with the Nose package
 
Verifying code behaviour
- Mocking dependent objects with the Mock package
 - Asserting correct code behaviour with MagicMock
 
Detecting Errors and Debugging Techniques
Identifying errors
- Logging messages forauditing and debugging
 - Checking your code for potential bugs with Pylint
 
Debugging Python code
- Extracting error information from exceptions
 - Tracing program execution with the PyCharm IDE
 
Implementing Python Design Patterns
Structural patterns
- Implementing the Decorator pattern using @decorator
 - Controlling access to an object with the Proxy pattern
 
Behavioural patterns
- Utilising the Iterator pattern with Python generators
 - Laying out a skeleton algorithm in the Template Method pattern
 - Enabling loose coupling between classes with the Observer pattern
 
Interfacing with REST Web Services and Clients
Python REST web services
- Building a REST service
 - Generating JSON responses to support Ajax clients
 
Python REST clients
- Sending REST requests from a Python client
 - Consuming JSON and XML response data
 
Measuring and Improving Application Performance
Measuring Application Execution
- Timing execution of functions with the "timeit" module
 - Profiling program execution using "cProfile"
 - Manipulating an execution profile interactively with "pstats"
 
Employing Python language features for performance
- Efficiently applying data structures, including lists, dictionaries and tuples
 - Mapping and filtering data sets using comprehensions
 - Replacing the standard Python interpreter with PyPy
 
Installing and Distributing Modules
Managing module versions
- Installing modules from the PyPi repository using "pip"
 - Porting code between Python versions
 
Packaging Python modules and applications
- Establishing isolated Python environments with "virtualenv"
 - Building a distribution package with "setuptools"
 - Uploading your Python modules to a local repository
 
Concurrent Execution
Lightweight threads
- Creating and managing multiple threads of control with the Thread class
 - Synchronising threads using locks
 
Heavy-weight processes
- Launching operating system commands as subprocesses
 - Synchronising processes with queues
 - Parallelising execution using process pools and Executors