[Tutor] Borg di borg di borg (or: Swedish chef)

eryksun eryksun at gmail.com
Mon Sep 24 19:01:30 CEST 2012


On Mon, Sep 24, 2012 at 6:02 AM, Albert-Jan Roskam <fomcl at yahoo.com> wrote:
>
> I have three classes, Generic, Test and Test2. Generic contains a load
> method that loads a file. This may only be done once, as a
> file_read_open error is returned if the file is open already and an
> attempt is made to re-open it. The file may be opened from Test or Test2.

What's the context here? Is "file_read_open error" an error code
returned by a library? If so, I'd pass it on by raising an exception
instead of masking the error.

As to the Borg pattern, it seems to me you don't actually need a
'Borg' base class. But if you do, then you probably also want to
override _state with a new dict for each subclass. You can do this
automatically with a custom descriptor, a metaclass, or even a simple
property like the following:

    class Borg(object):
        _all_state = {}

        def __init__(self):
            self.__dict__ = self._state

        @property
        def _state(self):
            return self._all_state.setdefault(self.__class__, {})


    class Generic(Borg):

        def __init__(self):
            super(Generic, self).__init__()
            self.loaded = None

        def load(self, filename):
            """ Only one file at a time may be opened, or else
            there will be an open-read error"""
            if self.loaded is None:
                self.loaded = open(filename)
            return self.loaded


More information about the Tutor mailing list