On Oct 3, 1:04 pm, Adam Lanier <[EMAIL PROTECTED]> wrote: > Relatively new to python development and I have a general question > regarding good class design. > > Say I have a couple of classes: > > Class Foo: > params = [ ] > __init__( self, param ): > ... > > Class Bar: > data = None > __init__( self, data ): > ... > > The class is going to be a wrapper around a list of Bars() (among other > things). I want the ability to pass to the constructor of Foo either: > a string 'baz' > a Bar object Bar( 'baz' ) > a list of strings and/or bars ( 'baz', Bar( 'something else' )) > > Am I going to have to use isinstance() to test the parameter to __init__ > to see what type of data I'm passing in, i.e., > > Class Foo: > params = [ ] > __init__( self, param ): > if isinstance( param, list ): > for p in param: > addParam( p ) > elif isinstance( param, str): > addParam( param ) > > addParam( self, param ): > if isinstance( param, Bar ): > self.params.add( param ) > elif isinstance( param, str ): > self.params.add( Bar( param )) > else: > raise TypeError( "wrong type of input" ) > > Am I missing something here or is there a more Pythonic way to > accomplish this?
I would use variable argument list for this; it's also consistent with your example Foo( 'baz', Bar( 'something else' )), otherwise you need to call it as Foo([ 'baz', Bar( 'something else' ) ]) # always inherit from object unless you have a good reason not to class Foo(object): # XXX this is a class instance, shared by all Foo instances; # XXX probably not what you intended params = [ ] def __init__(self, *args): # uncomment the following line for instance-specific params # self.params = [] for arg in args: if not isinstance(arg, Bar): # let the Bar constructor to do typechecking or whatnot arg = Bar(arg) self.params.add(arg) HTH, George -- http://mail.python.org/mailman/listinfo/python-list