factory functions & methods

Aaron Brady castironpi at gmail.com
Wed Mar 11 20:38:03 EDT 2009


On Mar 11, 12:52 pm, Piet van Oostrum <p... at cs.uu.nl> wrote:
> >>>>> Aaron Brady <castiro... at gmail.com> (AB) wrote:
> >AB> Hello,
> >AB> I am creating a container.  I have some types which are built to be
> >AB> members of the container.  The members need to know which container
> >AB> they are in, as they call methods on it, such as finding other
> >AB> members.  I want help with the syntax to create the members.
> >AB> Currently, the container has to be a parameter to the instantiation
> >AB> methods.  I want the option to create members with attribute syntax
> >AB> instead.
> >AB> Currently, I have:
> >AB> cA= Container( )
> >AB> obA= SomeType( cA )
> >AB> obB= OtherType( cA, otherarg )
> >AB> I want:
> >AB> cA= Container( )
> >AB> obA= cA.SomeType( )
> >AB> obB= cA.OtherType( otherarg )
> >AB> What are my options?
> >AB> P.S.  The container and members are C extension types, not pure Python.
>
> You could do something like this (translated to C)
>
> class Container(object):
>   def __init__(self):
>     self.items = []
>   def add(self, item):
>     self.items.append(item)
>   def SomeType(self):
>       newobj = SomeType()
>       self.add(newobj)
>   def OtherType(self, arg):
>       newobj = OtherType(arg)
>       self.add(newobj)
>
> class SomeType(object):
>   def __init__(self):
>       pass
>
> class OtherType(SomeType):
>   def __init__(self, arg):
>     SomeType.__init__(self)
>     self.x = arg
>
> cA = Container()
> obA = cA.SomeType()
> obB = cA.OtherType(5)
> print cA.items
>
> --
> Piet van Oostrum <p... at cs.uu.nl>
> URL:http://pietvanoostrum.com[PGP 8DAE142BE17999C4]
> Private email: p... at vanoostrum.org

I like it.  It's a combination of andrew's suggestion, and what I've
been considering.  What I did was (approximately):

class Container:
    def __init__( self ):
        self.SomeType= type( 'BoundSomeType', (SomeType,),
            { '__new__': custom_new } )
        self.OtherType= type( 'BoundOtherType', (OtherType,),
            { '__new__': custom_new } )

cA = Container()
obA = cA.SomeType()
obB = cA.OtherType(5)

It has the advantage that 'cA.SomeType' is a subclass of SomeType;
specifically, that it responds in kind to SomeType.  It's a bit
heavyweight on the consumption of resources.  'custom_new' actually
returns an instance of the base.

I am looking for ways to allow user-defined subclasses.

class CustomType( cA.MemberBase ):
    ...

obC= CustomType( ) #unusable in other instances

-or-

class CustomType( MemberBase ):
    ...

obC= cA.CustomType( ) #explicit member or dynamic (Gabriel)?
#of base (Piet) or instance (andrew)?

-or-

class CustomType( MemberBase ):
    ...

obC= CustomType( ) #disallow "as attribute" creation

Or, some combination of -2- and -1- or -3-.



More information about the Python-list mailing list