Online Book Reader

Home Category

Learning Python - Mark Lutz [386]

By Root 1667 0
3.0 shows additional attributes inherited from the implied object superclass in the new-style class model—run this on your own to see the 3.0 extras, and watch for more about this difference in Chapter 31):

>>> help(docstr)

Help on module docstr:

NAME

docstr - I am: docstr.__doc__

FILE

c:\misc\docstr.py

CLASSES

spam

class spam

| I am: spam.__doc__ or docstr.spam.__doc__

|

| Methods defined here:

|

| method(self, arg)

| I am: spam.method.__doc__ or self.method.__doc__

FUNCTIONS

func(args)

I am: docstr.func.__doc__

Documentation strings are available at runtime, but they are less flexible syntactically than # comments (which can appear anywhere in a program). Both forms are useful tools, and any program documentation is good (as long as it’s accurate, of course!). As a best-practice rule of thumb, use docstrings for functional documentation (what your objects do) and hash-mark comments for more micro-level documentation (how arcane expressions work).

Classes Versus Modules

Let’s wrap up this chapter by briefly comparing the topics of this book’s last two parts: modules and classes. Because they’re both about namespaces, the distinction can be confusing. In short:

Modules Are data/logic packages

Are created by writing Python files or C extensions

Are used by being imported

Classes Implement new objects

Are created by class statements

Are used by being called

Always live within a module

Classes also support extra features that modules don’t, such as operator overloading, multiple instance generation, and inheritance. Although both classes and modules are namespaces, you should be able to tell by now that they are very different things.

Chapter Summary

This chapter took us on a second, more in-depth tour of the OOP mechanisms of the Python language. We learned more about classes, methods, and inheritance, and we wrapped up the namespace story in Python by extending it to cover its application to classes. Along the way, we looked at some more advanced concepts, such as abstract superclasses, class data attributes, namespace dictionaries and links, and manual calls to superclass methods and constructors.

Now that we’ve learned all about the mechanics of coding classes in Python, Chapter 29 turns to a specific facet of those mechanics: operator overloading. After that we’ll explore common design patterns, looking at some of the ways that classes are commonly used and combined to optimize code reuse. Before you read ahead, though, be sure to work though the usual chapter quiz to review what we’ve covered here.

Test Your Knowledge: Quiz

What is an abstract superclass?

What happens when a simple assignment statement appears at the top level of a class statement?

Why might a class need to manually call the __init__ method in a superclass?

How can you augment, instead of completely replacing, an inherited method?

What...was the capital of Assyria?

Test Your Knowledge: Answers

An abstract superclass is a class that calls a method, but does not inherit or define it—it expects the method to be filled in by a subclass. This is often used as a way to generalize classes when behavior cannot be predicted until a more specific subclass is coded. OOP frameworks also use this as a way to dispatch to client-defined, customizable operations.

When a simple assignment statement (X = Y) appears at the top level of a class statement, it attaches a data attribute to the class (Class.X). Like all class attributes, this will be shared by all instances; data attributes are not callable method functions, though.

A class must manually call the __init__ method in a superclass if it defines an __init__ constructor of its own, but it also must still kick off the superclass’s construction code. Python itself automatically runs just one constructor—the lowest one in the tree. Superclass constructors are called through the class name, passing in the self instance manually: Superclass.__init__(self, ...).

To augment instead of completely replacing an inherited method,

Return Main Page Previous Page Next Page

®Online Book Reader