On Sep 7, 10:27 am, Carsten Haese <[EMAIL PROTECTED]> wrote: > 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 Haesehttp://informixdb.sourceforge.net
Unfortunately, it fails. Here's what I tried, followed by the traceback 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 class MyClass(SplinterBorg): def __init__(self, name): self.name = name a1 = MyClass('a') a2 = MyClass('aa') b1 = MyClass('b', group="B") Traceback (most recent call last): File "test.py", line 15, in <module> b1 = MyClass('b', group="B") TypeError: __init__() got an unexpected keyword argument 'group' -- http://mail.python.org/mailman/listinfo/python-list