Factory pattern again

Bruno Desthuilliers bruno.42.desthuilliers at wtf.websiteburo.oops.com
Fri Jul 27 12:00:24 CEST 2007


Mike Howarth a écrit :
> Hi 
> 
> I was wondering whether anyone could help me, I'm pretty new to python
> coming from a PHP background and I'm having a few products in getting my
> head round how to write the factory pattern within python.
> 
> I'm currently looking to try to return values from a db and load up the
> relevant objects, values returned are product type (I,S) and product code
> (123).
> 
> At the moment I've adapted some code I've found illustrating the factory
> method but ideally I would like to use the type to load up the relevant
> object.
> 
> Another issue I've found is that I don't seem to be able to access to the
> price attribute of each of the object. I'm sure these are very
> straightforward issues however I seem to have tied myself in knots over this
> and could do with a fresh set of 'pythonic' eyes to help me out.
> 
> registry = {}
> 
> class MetaBase(type):
>      def __init__(cls, name, bases, dict):
>          registry[name] = cls
> 
> class Product(object):
>      __metaclass__ = MetaBase
> 
> class Item(Product):
>      def __init__(self, *args, **kw): 
>          self.price = 1
>          
> class Set(Product):
>      def __init__(self, *args, **kw): 
>          self.price = 2
>          
> def factory(kind, *args, **kw):
>      return registry[kind](*args, **kw) 
>  
> 
> item = registry['Item']

This returns the Item *class*, not an instance of... So the following:

> print item.price

cannot work, since price is an instance attribute, not a class attribute.

What you want is:

item = factory('Item')
print item.price

HTH



More information about the Python-list mailing list