0% found this document useful (0 votes)
2 views46 pages

Python Modules

The document discusses the organization of classes in Python through modules and packages, explaining how to import and utilize classes from different files. It covers both absolute and relative imports, as well as the use of the __init__.py file to facilitate package imports. Additionally, it addresses the management of global states and the instantiation of classes to avoid performance issues in larger projects.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views46 pages

Python Modules

The document discusses the organization of classes in Python through modules and packages, explaining how to import and utilize classes from different files. It covers both absolute and relative imports, as well as the use of the __init__.py file to facilitate package imports. Additionally, it addresses the management of global states and the instantiation of classes to avoid performance issues in larger projects.
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Modules and Packages

Modules and Packages


• As we create more and more classes we need a way to
organise them in such a way to make then available and easy
to find.

• Modules in Python are simply files, if you have two files in the
same folder we can load a class from one module for use in the
other module.
Modules and Packages
• As we create more and more classes we need a way to
organise them in such a way to make then available and easy
to find.

• Modules in Python are simply files, if you have two files in the
same folder we can load a class from one module for use in the
other module.
Modules and Packages
• So, for example, if we are building an e-Commerce system, and
we create a single file (module) that contains all the classes
and methods related to accessing the database, then as long as
all the other necessary modules (product, customer, inventory
classes) are in the same folder, those modules can use the
database module to access the database.
Modules and Packages
• So if we put our Point class in a file (module) called:
– [Link]

• We can create another file (module) to include that class, by


doing the following:

import Pointdocstrings

p1 = [Link]()
Modules and Packages
# PROGRAM Calling-Point-Docstrings:

import Pointdocstrings

p1 = [Link]()
p2 = [Link]()

[Link](2,2)
[Link](6,5)

print("CALLING: P1-x, P1-y is: ", p1.x, p1.y)


print("CALLING: P2-x, P2-y is: ", p2.x, p2.y)
print("CALLING: Distance from P1 to P2 is:", p1.calc_distance(p2))

# END.
Modules and Packages
• When we bring Pointdocstrings into the calling
program, we say that Pointdocstrings is now part of the
calling program’s namespace (which is the list of methods and
classes available to the current program).
Modules and Packages
• If we just want to being one specific class in from a file
(module) we simple say:

from Pointdocstrings import Point

And we can declare instances as follows:

p1 = Point()
Modules and Packages
# PROGRAM Calling-Point-Docstrings:

from Pointdocstrings import Point

p1 = Point()
p2 = Point()

[Link](2,2)
[Link](6,5)

print("CALLING: P1-x, P1-y is: ", p1.x, p1.y)


print("CALLING: P2-x, P2-y is: ", p2.x, p2.y)
print("CALLING: Distance from P1 to P2 is:", p1.calc_distance(p2))

# END.
Modules and Packages
• If we already have a class called Point in the existing
namespace, then we can use the as clause:

from Pointdocstrings import Point as Pt

And we can declare instances as follows:

p1 = Pt()
Modules and Packages
# PROGRAM Calling-Point-Docstrings:

from Pointdocstrings import Point as Pt

p1 = Pt()
p2 = Pt()

[Link](2,2)
[Link](6,5)

print("CALLING: P1-x, P1-y is: ", p1.x, p1.y)


print("CALLING: P2-x, P2-y is: ", p2.x, p2.y)
print("CALLING: Distance from P1 to P2 is:", p1.calc_distance(p2))

# END.
Modules and Packages
• If we want to import more than one class we do:

from Pointdocstrings import Point, Line

But we should avoid doing this:

from Pointdocstrings import *


Organizing the Modules
Modules and Packages
• As projects get larger and larger it becomes more and more
difficult to organise all of the modules (Python files) in a single
folder.
• To help with this issue, Python allows you to organise your
modules into sub-folders (called Packages). The name of the
package is the name of the folder.
Modules and Packages
• To achieve this we place a file called _ _init_ _.py in each
sub-folder we wish to be included in the project.
parent_directory/
[Link]
Drawing/
_ _init_ _.py
[Link]
[Link]
Maths/
_ _init_ _.py
[Link]
Modules and Packages
• To achieve this we place a file called _ _init_ _.py in each
sub-folder we wish to be included in the project.
parent_directory/
[Link]
Drawing/
_ _init_ _.py
_ _init_ _.py
[Link]
[Link]
Maths/
_ _init_ _.py
[Link]
Modules and Packages
• For the moment we are going to assume that the special files,
the _ _init_ _.py is empty.

• We can import packages in two ways, using Absolute Imports


and Relative Imports.
Modules and Packages:
Absolute Imports

• An absolute import is an IMPORT where you fully specify the


location of the classes being imported.
Modules and Packages:
Absolute Imports
• We can do this in a number of ways:

import [Link]-call
P1 = [Link]()

from [Link]-call import Point


P1 = Point()

from Drawing import point-call


P1 = [Link]()
Modules and Packages:
Absolute Imports
• We can do this in a number of ways:
PACKAGE MODULE
import [Link]-call
P1 = [Link]()

PACKAGE MODULE
from [Link]-call import Point
CLASS
P1 = Point()

from DPrAaCwKiAnGgEimport poiMntO-DcUaLlEl


P1 = [Link]()
Modules and Packages:
Relative Imports

• Relative Imports specific the location of the classes to be


imported relative to the current package.
Modules and Packages:
Relative Imports

• Relative Imports specific the location of the classes to be


imported relative to the current package.

The current directory .


(package)
The previous directory ..
(package)
Modules and Packages:
Relative Imports
Modules and Packages:
Relative Imports

If [Link]
wants to call
[Link],
you can say:

from
.[Link]
import
Point
Modules and Packages:
Relative Imports

If [Link]
wants to call
[Link],
you can say:

from
..[Link]
import
Point
Using the __init__.py
Using the __init__.py
• If we wish to import code directly from a package as opposed
to a module, we can use the _ _init_ _.py.

• So lets say we want to get the Point() class from the


module [Link].

• From the main directory we’d have to say:


import [Link]()
Using the __init__.py
• If add the following code to the _ _init_ _.py in the
Drawing package:
from .Point-docstrings import Point()

• From the main directory now we can say:


import [Link]()
• Instead of:
import [Link]()
Using the __init__.py
• And if we want to import this class into any new module, all we
have to say is:
from Drawing import Point()
Using the __init__.py
• And if we want to import this class into any new module, all we
have to say is:
from Drawing import Point()

• It’s almost as if the _ _init_ _.py file converts the


Drawing package into a module!
Organizing Module Contents
Organizing Module Contents
• Inside a module we can specify variables, classes or methods.

• We can use modules to store global states without any


namespace conflicts.

• As well as classes, we can share global objects across a whole


system.
Organizing Module Contents
• If we think about an e-Commerce system again, which
connects to a database. There should be one Database class,
and one instance of a database object.

• Let’s look at the case where there are several local copies of
the database object.
Organizing Module Contents
• The Database module could look like:

[Link]
class Database:
# The database implementation
pass
# End Database.

database1 = Database()
Organizing Module Contents
• And then any module could call the database as follow:

from [Link] import database1


Organizing Module Contents
• There is potentially a problem with the previous
implementation, as soon of [Link] is imported, the
database object is instantiated, if this does connect to a
database, it will cause a slight delay while the connection is
being made.

• If multiple connections are being made (multiple imports), this


will slow down the process.
Organizing Module Contents
• We could re-write as follows:
class Database:

[Link]
# The database implementation
pass
# End Database.

database1 = None

def initialize_database():
global database1
database1 = Database()
# End initialize_database.
Organizing Module Contents
• Now that the variable database1 is global, all other modules
can access it.

• This prevents the system from instantiating a new database


object every time [Link] is called.
Organizing Module Contents
• If we want to differentiate between when a module is being
called from another module, or is being called directly from the
command prompt (script), we can use the _ _main_ _
variable.

• We can do the following:


Organizing Module Contents
class UsefulClass:
“““This class might be useful to other modules”””
pass

[Link]
# End UserfulClass.

def main():
global database1
database1 = Database()
# End main.

If _ _name_ _ == “_ _main_ _”:


main()
# Endif;
Organizing Module Contents
• Up until now we have assumed that classes contain methods
and attributes, but in Python, we can have a class inside a
method.

• As follows:
Organizing Module Contents
def format_string(string, formatter=None):
'''Format a string using the formatter object, which is
expected to have a format() method that accepts a string.'''

class DefaultFormatter:
'''Format a string in title case.''‘

def format(self, string):


return str(string).title()
# End format.

# End Class.

Continued 
 Continued
Organizing Module Contents
if not formatter:
formatter = DefaultFormatter()
# Endif;
return [Link](string)

# End format_string

hello_string = "hello world, how are you today?"


print(" input: " + hello_string)
print("output: " + format_string(hello_string))
 Continued
Organizing Module Contents
if not formatter:
formatter = DefaultFormatter()
# Endif;
return [Link](string)

# End format_string

hello_string = "hello world, how are you today?"


print(" input: " + hello_string)
print("output: " + format_string(hello_string))
input: hello world, how are you today?
output: Hello World, How Are You Today?
Organizing Module Contents
• The format_string method accepts a string and optional
formatter object, which by default is set to None, so if the
method is called with no formatter, it will be treated as None.
• If no formatter is supplied, it creates a formatter of its own as a
local class and instantiates it. Since it is created inside the
scope of the function, this class cannot be accessed from
anywhere outside of that function.

You might also like