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