Is a Borg rebellion possible? (a metaclass question)
Carsten Haese
carsten at uniqsys.com
Fri Sep 7 09:27:35 EDT 2007
On Fri, 2007-09-07 at 12:31 +0000, André wrote:
> In my application, I make use of the Borg idiom, invented by Alex
> Martelli.
>
> class Borg(object):
> '''Borg Idiom, from the Python Cookbook, 2nd Edition, p:273
>
> Derive a class form this; all instances of that class will share
> the
> same state, provided that they don't override __new__; otherwise,
> remember to use Borg.__new__ within the overriden class.
> '''
> _shared_state = {}
> def __new__(cls, *a, **k):
> obj = object.__new__(cls, *a, **k)
> obj.__dict__ = cls._shared_state
> return obj
>
> ----
> This has worked very well so far, but is starting to impose some
> unwanted constraints on my program design.
>
> What I would like to do is, to put it figuratively, create a Borg
> rebellion with various splinter groups. In concrete Python terms, I
> would like to have
>
> class MyClass(Borg, ...):
> ...
>
> seven_of_nine = MyClass(...) # part of group "BORG"
> two_of_nine = MyClass(...)
>
> splinter1 = MyClass(..., group='splinter')
> splinter2 = MyClass(..., group='splinter')
>
> and have splinter 1 and splinter2 share the same state, but a
> different state than the one shared by members of the BORG collective.
>
> Any suggestions from the metaclass experts?
You don't need a metaclass. Just turn _shared_state into a dictionary of
shared states, keyed by the group name:
class SplinterBorg(object):
_shared_states = {}
def __new__(cls, *a, **k):
group = k.pop("group","BORG")
obj = object.__new__(cls, *a, **k)
obj.__dict__ = cls._shared_states.setdefault(group,{})
return obj
HTH,
--
Carsten Haese
http://informixdb.sourceforge.net
More information about the Python-list
mailing list