Re: Use of factory pattern in Python?

Discussion in 'Python' started by Gabriel Genellina, Dec 7, 2006.

  1. At Thursday 7/12/2006 05:28, Nathan Harmston wrote:

    >chr1 SGD gene 5 8 id=1 name=3 dbref=6
    >chr1 SGD intron 5 6 id=5 notes="spam"
    >chr1 SGD exon 7 8 id=5
    >
    >so I was thinking of having a factory class to return the individual
    >objects for each row......ie
    >
    >class Factory():
    > # if passed a gene return a gene object
    > # if passed an intron return an intron object
    > # if passed an exom return an exon object
    >
    >Is this a good way of doing this, or is there a better way to do this
    >in Python, this is probably the way I d do it in Java.


    The basic idea is the same, but instead of a long series of
    if...elif...else you can use a central registry (a dictionary will
    do) and dispatch on the name. Classes act as their own factories.

    registry = {}

    class Base(object):
    kind = "Unknown"
    register(Base)

    class Gene(Base):
    kind = "gene"
    def __init__(self, *args, **kw): pass
    register(Gene)

    class Intron(Base):
    kind = "intron"
    def __init__(self, *args, **kw): pass
    register(Intron)

    def register(cls):
    registry[cls.kind] = cls

    def factory(kind, *args, **kw):
    return registry[kind](*args, **kw)

    If some arguments are always present, you can name them, you're not
    limited to use the generic *args and **kw.


    --
    Gabriel Genellina
    Softlab SRL

    __________________________________________________
    Correo Yahoo!
    Espacio para todos tus mensajes, antivirus y antispam ¡gratis!
    ¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar
     
    Gabriel Genellina, Dec 7, 2006
    #1
    1. Advertising

  2. Gabriel Genellina <> wrote:
    > The basic idea is the same, but instead of a long series of
    > if...elif...else you can use a central registry (a dictionary will
    > do) and dispatch on the name. Classes act as their own factories.
    >
    > registry = {}
    >
    > class Base(object):
    > kind = "Unknown"
    > register(Base)
    >
    > class Gene(Base):
    > kind = "gene"
    > def __init__(self, *args, **kw): pass
    > register(Gene)
    >
    > class Intron(Base):
    > kind = "intron"
    > def __init__(self, *args, **kw): pass
    > register(Intron)
    >
    > def register(cls):
    > registry[cls.kind] = cls
    >
    > def factory(kind, *args, **kw):
    > return registry[kind](*args, **kw)
    >
    > If some arguments are always present, you can name them, you're not
    > limited to use the generic *args and **kw.


    If you don't want to use a register() function on each class you could
    introspect like this (untested) to make the registry :-

    registry = {}
    for obj in sys.modules[__name__].__dict__.values():
    try:
    if issubclass(obj, Base):
    registry[kind] = obj
    except TypeError:
    pass

    There might be a neater way of writing the above!

    --
    Nick Craig-Wood <> -- http://www.craig-wood.com/nick
     
    Nick Craig-Wood, Dec 7, 2006
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Medi Montaseri
    Replies:
    17
    Views:
    878
    Medi Montaseri
    Sep 3, 2003
  2. Nathan Harmston

    Use of factory pattern in Python?

    Nathan Harmston, Dec 7, 2006, in forum: Python
    Replies:
    0
    Views:
    338
    Nathan Harmston
    Dec 7, 2006
  3. Jan Dries

    Re: Use of factory pattern in Python?

    Jan Dries, Dec 7, 2006, in forum: Python
    Replies:
    0
    Views:
    522
    Jan Dries
    Dec 7, 2006
  4. sunny
    Replies:
    1
    Views:
    466
    Salt_Peter
    Dec 7, 2006
  5. C#
    Replies:
    4
    Views:
    412
Loading...

Share This Page