Dictionary of "structs" with functions as components?

Neil Schemenauer nas at python.ca
Sun Apr 29 16:13:02 EDT 2001


Eric Sandeen wrote:
> First a disclaimer - I'm pretty new to Python, and OOP is not really my
> bag, so forgive me if this is a silly question...

OOP is easy.  Its just data and functions.

> I'm trying to create a data structure which holds information about
> several different filesystems
[...]
> FSystems['ext2'].PrettyName = "ext2 filesystem" 
> FSystems['ext2'].MagicNo = 0xce32
> FSystems['ext2'].MagicNoPos = 1080
> 
> FSystems['xfs'].PrettyName = "XFS filesystem" 
> FSystems['xfs'].MagicNo = "XFSB"
> FSystems['xfs'].MagicNoPos = 0
[...]
> The problem comes when I'd like to define a unique function for each
> filesystem to actually create the filesystem, since this will vary quite a
> bit from fs to fs.  I'd like to access it via something like
> 
> FSystems[<fstype>].unique_fs_function()

Funtions are first class objects in Python.  You can use them
just like any other objects (like and integer or string).  This
will work:

    def ext2_fs_function():
        ...

    FSystems["ext2"].unique_fs_function = ext2_fs_function

A more OO approach would be to use a class:


    FSystems = {}

    def register_fs(klass):
        FSystems[klass.name] = klass

    class FileSystem:
        def create(self):
            raise NotImplementedError

    class Ext2FileSystem(FileSystem):

        name = "ext2"
        pretty_name = "ext2 filesystem"
        ...

        def __init__(self, device, mount_point):
            self.device = device
            self.mount_point = mount_point

        def create(self):
            ...

    register_fs(Ext2FileSystem)

    def make_fs(type, *args):
        klass = FSystems[type]
        return apply(klass, args)

    home = make_fs("ext2", "/dev/hda1", "/home")
    home.create()
    

Cheers,

  Neil




More information about the Python-list mailing list