Online Book Reader

Home Category

Learning Python - Mark Lutz [379]

By Root 1727 0
generated by assignments to self attributes in methods.

Class attributes are created by statements (assignments) in class statements.

Superclass links are made by listing classes in parentheses in a class statement header.

The net result is a tree of attribute namespaces that leads from an instance, to the class it was generated from, to all the superclasses listed in the class header. Python searches upward in this tree, from instances to superclasses, each time you use qualification to fetch an attribute name from an instance object.[66]

Specializing Inherited Methods

The tree-searching model of inheritance just described turns out to be a great way to specialize systems. Because inheritance finds names in subclasses before it checks superclasses, subclasses can replace default behavior by redefining their superclasses’ attributes. In fact, you can build entire systems as hierarchies of classes, which are extended by adding new external subclasses rather than changing existing logic in-place.

The idea of redefining inherited names leads to a variety of specialization techniques. For instance, subclasses may replace inherited attributes completely, provide attributes that a superclass expects to find, and extend superclass methods by calling back to the superclass from an overridden method. We’ve already seen replacement in action. Here’s an example that shows how extension works:

>>> class Super:

... def method(self):

... print('in Super.method')

...

>>> class Sub(Super):

... def method(self): # Override method

... print('starting Sub.method') # Add actions here

... Super.method(self) # Run default action

... print('ending Sub.method')

...

Figure 28-1. Program code creates a tree of objects in memory to be searched by attribute inheritance. Calling a class creates a new instance that remembers its class, running a class statement creates a new class, and superclasses are listed in parentheses in the class statement header. Each attribute reference triggers a new bottom-up tree search—even references to self attributes within a class’s methods.

Direct superclass method calls are the crux of the matter here. The Sub class replaces Super’s method function with its own specialized version, but within the replacement, Sub calls back to the version exported by Super to carry out the default behavior. In other words, Sub.method just extends Super.method’s behavior, rather than replacing it completely:

>>> x = Super() # Make a Super instance

>>> x.method() # Runs Super.method

in Super.method

>>> x = Sub() # Make a Sub instance

>>> x.method() # Runs Sub.method, calls Super.method

starting Sub.method

in Super.method

ending Sub.method

This extension coding pattern is also commonly used with constructors; see the section Methods for an example.

Class Interface Techniques

Extension is only one way to interface with a superclass. The file shown in this section, specialize.py, defines multiple classes that illustrate a variety of common techniques:

Super

Defines a method function and a delegate that expects an action in a subclass.

Inheritor

Doesn’t provide any new names, so it gets everything defined in Super.

Replacer

Overrides Super’s method with a version of its own.

Extender

Customizes Super’s method by overriding and calling back to run the default.

Provider

Implements the action method expected by Super’s delegate method.

Study each of these subclasses to get a feel for the various ways they customize their common superclass. Here’s the file:

class Super:

def method(self):

print('in Super.method') # Default behavior

def delegate(self):

self.action() # Expected to be defined

class Inheritor(Super): # Inherit method verbatim

pass

class Replacer(Super): # Replace method completely

def method(self):

print('in Replacer.method')

class Extender(Super): # Extend method behavior

def method(self):

print('starting Extender.method')

Super.method(self)

print('ending Extender.method')

class Provider(Super): # Fill in a required method

Return Main Page Previous Page Next Page

®Online Book Reader