万本电子书0元读

万本电子书0元读

顶部广告

Mastering Object Oriented Python电子书

售       价:¥

3人正在读 | 0人评论 9.8

作       者:Steven F. Lott

出  版  社:Packt Publishing

出版时间:2014-04-22

字       数:376.0万

所属分类: 进口书 > 外文原版书 > 电脑/网络

温馨提示:数字商品不支持退换货,不提供源文件,不支持导出打印

为你推荐

  • 读书简介
  • 目录
  • 累计评论(0条)
  • 读书简介
  • 目录
  • 累计评论(0条)
This book follows a standard tutorial approach with approximately 750 code samples spread through the 19 chapters. This amounts to over 5,900 lines of code that illustrate each concept. This book is aimed at programmers who have already learned the basics of objectoriented Python and need to write more sophisticated, flexible code that integrates seamlessly with the rest of Python. This book assumes a computer science background, with experience of common Python design patterns.
目录展开

Mastering Object-oriented Python

Table of Contents

Mastering Object-oriented Python

Credits

About the Author

About the Reviewers

www.PacktPub.com

Support files, eBooks, discount offers and more

Why Subscribe?

Free Access for Packt account holders

Preface

What this book covers

What you need for this book

Who this book is for

Conventions

Reader feedback

Customer support

Downloading the example code for this book

Errata

Piracy

Questions

Some Preliminaries

About casino Blackjack

Playing the game

Blackjack player strategies

Object design for simulating Blackjack

Performance – the timeit module

Testing – unittest and doctest

Unit testing and technology spikes

Docstrings – RST markup and documentation tools

The IDE question

About special method names

Summary

1. Pythonic Classes via Special Methods

Pythonic Classes via Special Methods

1. The __init__() Method

The implicit superclass – object

The base class object __init__() method

Implementing __init__() in a superclass

Using __init__() to create manifest constants

Leveraging __init__() via a factory function

Faulty factory design and the vague else clause

Simplicity and consistency using elif sequences

Simplicity using mapping and class objects

Two parallel mappings

Mapping to a tuple of values

The partial function solution

Fluent APIs for factories

Implementing __init__() in each subclass

Simple composite objects

Wrapping a collection class

Extending a collection class

More requirements and another design

Complex composite objects

Complete composite object initialization

Stateless objects without __init__()

Some additional class definitions

Multi-strategy __init__()

More complex initialization alternatives

Initializing static methods

Yet more __init__() techniques

Initialization with type validation

Initialization, encapsulation, and privacy

Summary

2. Integrating Seamlessly with Python Basic Special Methods

The __repr__() and __str__() methods

Non collection __str__() and __repr__()

Collection __str__() and __repr__()

The __format__() method

Nested formatting specifications

Collections and delegating format specifications

The __hash__() method

Deciding what to hash

Inheriting definitions for immutable objects

Overriding definitions for immutable objects

Overriding definitions for mutable objects

Making a frozen hand from a mutable hand

The __bool__() method

The __bytes__() method

The comparison operator methods

Designing comparisons

Implementation of comparison for objects of the same class

Implementation of comparison for objects of mixed classes

Hard totals, soft totals, and polymorphism

A mixed class comparison example

The __del__() method

The reference count and destruction

Circular references and garbage collection

Circular references and the weakref module

The __del__() and close() methods

The __new__() method and immutable objects

The __new__() method and metaclasses

Metaclass example 1 – ordered attributes

Metaclass example 2 – self-reference

Summary

3. Attribute Access, Properties, and Descriptors

Basic attribute processing

Attributes and the __init__() method

Creating properties

Eagerly computed properties

Setter and deleter properties

Using special methods for attribute access

Creating immutable objects with __slots__

Creating immutable objects as a tuple subclass

Eagerly computed attributes

The __getattribute__() method

Creating descriptors

Using a nondata descriptor

Using a data descriptor

Summary, design considerations, and trade-offs

Properties versus attributes

Designing with descriptors

Looking forward

4. The ABCs of Consistent Design

Abstract base classes

Base classes and polymorphism

Callables

Containers and collections

Numbers

Some additional abstractions

The iterator abstraction

Contexts and context managers

The abc module

Summary, design considerations, and trade-offs

Looking forward

5. Using Callables and Contexts

Designing with ABC callables

Improving performance

Using memoization or caching

Using functools for memoization

Aiming for simplicity using the callable API

Complexities and the callable API

Managing contexts and the with statement

Using the decimal context

Other contexts

Defining the __enter__() and __exit__() methods

Handling exceptions

Context manager as a factory

Cleaning up in a context manager

Summary

Callable design considerations and trade-offs

Context manager design considerations and trade-offs

Looking forward

6. Creating Containers and Collections

ABCs of collections

Examples of special methods

Using the standard library extensions

The namedtuple() function

The deque class

The ChainMap use case

The OrderedDict collection

The defaultdict subclass

The counter collection

Creating new kinds of collections

Defining a new kind of sequence

A statistical list

Choosing eager versus lazy calculation

Working with __getitem__(), __setitem__(), __delitem__(), and slices

Implementing __getitem__(), __setitem__(), and __delitem__()

Wrapping a list and delegating

Creating iterators with __iter__()

Creating a new kind of mapping

Creating a new kind of set

Some design rationale

Defining the Tree class

Defining the TreeNode class

Demonstrating the binary tree set

Summary

Design considerations and Trade-offs

Looking forward

7. Creating Numbers

ABCs of numbers

Deciding which types to use

The method resolution and the reflected operator concept

The arithmetic operator's special methods

Creating a numeric class

Defining FixedPoint initialization

Defining FixedPoint binary arithmetic operators

Defining FixedPoint unary arithmetic operators

Implementing FixedPoint reflected operators

Implementing FixedPoint comparison operators

Computing a numeric hash

Designing more useful rounding

Implementing other special methods

Optimization with the in-place operators

Summary

Design considerations and trade-offs

Looking forward

8. Decorators and Mixins – Cross-cutting Aspects

Class and meaning

Constructing the functions

Constructing the class

Some class design principles

Aspect-oriented programming

Using built-in decorators

Using standard library decorators

Using standard library mixin classes

Using the context manager mixin class

Turning off a class feature

Writing a simple function decorator

Creating separate loggers

Parameterizing a decorator

Creating a method function decorator

Creating a class decorator

Adding method functions to a class

Using decorators for security

Summary

Design considerations and trade-offs

Looking forward

2. Persistence and Serialization

Persistence and Serialization

9. Serializing and Saving – JSON, YAML, Pickle, CSV, and XML

Understanding persistence, class, state, and representation

Common Python terminologies

Filesystem and network considerations

Defining classes to support persistence

Rendering a blog and posts

Dumping and loading with JSON

Supporting JSON in our classes

Customizing JSON encoding

Customizing JSON decoding

The security and the eval() issue

Refactoring the encode function

Standardizing the date string

Writing JSON to a file

Dumping and loading with YAML

Formatting YAML data on a file

Extending the YAML representation

Security and safe loading

Dumping and loading with pickle

Designing a class for reliable pickle processing

Security and the global issue

Dumping and loading with CSV

Dumping simple sequences to CSV

Loading simple sequences from CSV

Handling containers and complex classes

Dumping and loading multiple row types in a CSV file

Filtering CSV rows with an iterator

Dumping and loading joined rows in a CSV file

Dumping and loading with XML

Dumping objects using string templates

Dumping objects with xml.etree.ElementTree

Loading XML documents

Summary

Design considerations and trade-offs

Schema evolution

Looking forward

10. Storing and Retrieving Objects via Shelve

Analyzing persistent object use cases

The ACID properties

Creating a shelf

Designing shelvable objects

Designing keys for our objects

Generating surrogate keys for objects

Designing a class with a simple key

Designing classes for containers or collections

Referring to objects via foreign keys

Designing CRUD operations for complex objects

Searching, scanning, and querying

Designing an access layer for shelve

Writing a demonstration script

Creating indexes to improve efficiency

Creating top-level indices

Adding yet more index maintenance

The writeback alternative to index updates

Schema evolution

Summary

Design considerations and trade-offs

Application software layers

Looking forward

11. Storing and Retrieving Objects via SQLite

SQL databases, persistence, and objects

The SQL data model – rows and tables

CRUD processing via SQL DML statements

Querying rows with the SQL SELECT statement

SQL transactions and the ACID properties

Designing primary and foreign database keys

Processing application data with SQL

Implementing class-like processing in pure SQL

Mapping Python objects to SQLite BLOB columns

Mapping Python objects to database rows manually

Designing an access layer for SQLite

Implementing container relationships

Improving performance with indices

Adding an ORM layer

Designing ORM-friendly classes

Building the schema with the ORM layer

Manipulating objects with the ORM layer

Querying post objects given a tag string

Improving performance with indices

Schema evolution

Summary

Design considerations and trade-offs

Mapping alternatives

Keys and key designs

Application software layers

Looking forward

12. Transmitting and Sharing Objects

Class, state, and representation

Using HTTP and REST to transmit objects

Implementing CRUD operations via REST

Implementing non-CRUD operations

The REST protocol and ACID

Choosing a representation – JSON, XML, or YAML

Implementing a REST server – WSGI and mod_wsgi

Creating a simple REST application and server

Implementing a REST client

Demonstrating and unit testing the RESTful services

Using Callable classes for WSGI applications

Designing RESTful object identifiers

Multiple layers of REST services

Creating the roulette server

Creating the roulette client

Creating a secure REST service

The WSGI Authentication application

Implementing REST with a web application framework

Using a message queue to transmit objects

Defining processes

Building queues and supplying data

Summary

Design considerations and trade-offs

Schema evolution

Application software layers

Looking forward

13. Configuration Files and Persistence

Configuration file use cases

Representation, persistence, state, and usability

Application configuration design patterns

Configuring via object construction

Implementing a configuration hierarchy

Storing the configuration in the INI files

Handling more literals via the eval() variants

Storing the configuration in PY files

Configuration via class definitions

Configuration via SimpleNamespace

Using Python with exec() for the configuration

Why is exec() a nonproblem?

Using ChainMap for defaults and overrides

Storing the configuration in JSON or YAML files

Using flattened JSON configurations

Loading a YAML configuration

Storing the configuration in property files

Parsing a properties file

Using a properties file

Storing the configuration in XML files – PLIST and others

Customized XML configuration files

Summary

Design considerations and trade-offs

Creating a shared configuration

Schema evolution

Looking Forward

3. Testing, Debugging, Deploying, and Maintaining

Testing, Debugging, Deploying, and Maintaining

14. The Logging and Warning Modules

Creating a basic log

Creating a shared class-level logger

Configuring the loggers

Starting up and shutting down the logging system

Naming the loggers

Extending the logger levels

Defining handlers for multiple destinations

Managing the propagation rules

Configuration gotcha

Specializing logging for control, debug, audit, and security

Creating a debugging log

Creating audit and security logs

Using the warnings module

Showing API changes with a warning

Showing configuration problems with a warning

Showing possible software problems with a warning

Advanced logging – the last few messages and network destinations

Building an automatic tail buffer

Sending logging messages to a remote process

Preventing queue overrun

Summary

Design considerations and trade-offs

Looking forward

15. Designing for Testability

Defining and isolating units for testing

Minimizing the dependencies

Creating simple unit tests

Creating a test suite

Including edge and corner cases

Mocking dependencies for testing

Using more mocks to test more behaviors

Using doctest to define test cases

Combining doctest and unittest

Creating a more complete test package

Using setup and teardown

Using setup and teardown with OS resources

Using setup and teardown with databases

The TestCase class hierarchy

Using externally defined expected results

Automated integration or performance testing

Summary

Design considerations and trade-offs

Looking forward

16. Coping With the Command Line

The OS interface and the command line

Arguments and options

Parsing the command line with argparse

A simple on/off option

An option with an argument

Positional arguments

All other arguments

--version display and exit

--help display and exit

Integrating command-line options and environment variables

Providing more configurable defaults

Overriding configuration file settings with environment variables

Overriding environment variables with the configuration files

Making the configuration aware of the None values

Customizing the help output

Creating a top-level main() function

Ensuring DRY for the configuration

Managing nested configuration contexts

Programming In The Large

Designing command classes

Adding the analysis command subclass

Adding and packaging more features into an application

Designing a higher-level composite command

Additional composite command design patterns

Integrating with other applications

Summary

Design considerations and trade-offs

Looking forward

17. The Module and Package Design

Designing a module

Some module design patterns

Module versus class

The expected content of a module

Whole module versus module items

Designing a package

Designing a module-package hybrid

Designing a package with alternate implementations

Designing a main script and the __main__ module

Creating an executable script file

Creating a __main__ module

Programming in the large

Designing long-running applications

Organizing code into src, bin, and test

Installing Python modules

Summary

Design considerations and trade-offs

Looking forward

18. Quality and Documentation

Writing docstrings for the help() function

Using pydoc for documentation

Better output via the RST markup

Blocks of text

The RST inline markup

RST directives

Learning RST

Writing effective docstrings

Writing file-level docstrings, including modules and packages

Writing API details in RST markup

Writing class and method function docstrings

Writing function docstrings

More sophisticated markup techniques

Using Sphinx to produce the documentation

Using the Sphinx quickstart

Writing the Sphinx documentation

Filling in the 4+1 views for documentation

Writing the implementation document

Creating the Sphinx cross-references

Refactoring Sphinx files into directories

Writing the documentation

Literate programming

Use cases for literate programming

Working with a literate programming tool

Summary

Design considerations and trade-offs

Index

累计评论(0条) 0个书友正在讨论这本书 发表评论

发表评论

发表评论,分享你的想法吧!

买过这本书的人还买过

读了这本书的人还在读

回顶部