Path: csiph.com!usenet.pasdenom.info!dedibox.gegeweb.org!gegeweb.eu!nntpfeed.proxad.net!proxad.net!feeder1-2.proxad.net!usenet-fr.net!nerim.net!novso.com!newsfeed.xs4all.nl!newsfeed6.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail Return-Path: X-Original-To: python-list@python.org Delivered-To: python-list@mail.python.org X-Spam-Status: OK 0.017 X-Spam-Evidence: '*H*': 0.97; '*S*': 0.00; "'a'": 0.07; 'determines': 0.09; 'dict': 0.09; 'name):': 0.09; 'def': 0.10; 'cases': 0.15; "['a',": 0.16; 'foo(object):': 0.16; 'list)': 0.16; 'ugly.': 0.16; 'instance': 0.17; 'bit': 0.21; 'subject:skip:i 10': 0.22; 'defined': 0.22; 'seems': 0.23; 'pass': 0.25; 'header:User- Agent:1': 0.26; 'common': 0.26; 'topic': 0.27; 'assert': 0.29; 'obj': 0.29; 'skip:_ 10': 0.29; 'class': 0.29; "i'm": 0.29; 'classes': 0.30; 'function': 0.30; 'instances': 0.33; 'problem': 0.33; 'to:addr:python-list': 0.33; 'list': 0.35; 'path': 0.35; 'doing': 0.35; 'something': 0.35; 'there': 0.35; 'but': 0.36; 'two': 0.37; 'received:10': 0.38; 'to:addr:python.org': 0.39; 'list,': 0.39; 'content-disposition:inline': 0.60; 'thomas': 0.62; 'provide': 0.62; 'received:85': 0.65; 'nice,': 0.84; 'received:10.94': 0.84; '\xe2\x80\xa6': 0.84 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=uni-mainz.de; i=@uni-mainz.de; q=dns/txt; s=ironport; t=1345065531; x=1376601531; h=date:from:to:subject:message-id:mime-version: content-transfer-encoding; bh=hsRQ8ZMficIxoNo7u35+vZIvT8iGxMR/SXJpVzeGx90=; b=cPudi+rdGMhqzWrQnLZpSXXpthofOKU6sEfAJRn2yAESpwpgMamLOwOd 0EfIDx4YuUz7KYhAZyFIBd90tjkqjarT7nW+KBrQMoDtME6/ctFi2RvIV 44LqDsDx7wjk2mxjMXSCNdvz4IvlDPHMjxARZiKlCYUTSZDGf8BSoq2K1 w=; X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ap0EAEQQLFAKXgZQ/2dsb2JhbABFhgG1H4JKDwFeHQImAhYoCxYuh3aYV45Bky+BIY0iggoyYAOVTpATgmE Date: Wed, 15 Aug 2012 23:17:41 +0200 From: Thomas Bach To: Subject: Dynamically determine base classes on instantiation MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit User-Agent: Mutt/1.5.21 (2010-09-15) X-Originating-IP: [85.178.249.115] X-BeenThere: python-list@python.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: General discussion list for the Python programming language List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Newsgroups: comp.lang.python Message-ID: Lines: 50 NNTP-Posting-Host: 2001:888:2000:d::a6 X-Trace: 1345065532 news.xs4all.nl 6959 [2001:888:2000:d::a6]:46364 X-Complaints-To: abuse@xs4all.nl Xref: csiph.com comp.lang.python:27114 Hi list, I'm confronted with a strang problem I cannot find a clean solution for. To me it seems like I need meta-classes. Anyway, I stucked a bit deeper in that topic and couldn't find a proper solution neither. But, judge for yourselve. I want a class that determines on instantiating its base classes dynamically. Consider the following two use cases a = Foo(['a', 'list']) # returns an instance that behaves like a list assert len(a) == 2 assert a[0] == 'a' assert a == ['a', 'list'] assert isinstance(a, list) # This would be nice, but no must-have b = Foo({'blah': 8}) # returns an instance that behaves like a dict assert b['blah'] == 'blah' assert b == {'blah': 8} assert isinstance(b, dict) # again, no must-have a.do_something() # common function to both instances as defined b.do_something() # in the Foo class What I'm currently doing something like the following: class Foo(object): def __init__(self, obj): self._obj = obj def __len__(self): return len(self._obj) def __getitem__(self, name): return self._obj[name] # … def do_something(self): # do something on self._obj pass Which seems ugly. Is there a way to provide the functions of `list' and `dict' in Foo's look-up path without having to write all the stubs myself? Regards, Thomas Bach.