metaclasses (beginner question)

Laszlo Nagy gandalf at designaproduct.biz
Wed Feb 21 08:30:43 EST 2007


   Hello,

I would like to create a hierarchy classes, where the leaves have a 
special attribute called "producer_id". In addition, I would like to 
have a function that can give me back the class assigned to any 
producer_id value. I tried to implement this with a metaclass, but I 
failed. Please help me, what I did wrong?

Thanks,

   Laszlo


class ProducerHandlerType(type):
    producer_handlers = {}
    @classmethod
    def registerProducerHandler(cls,producer_id):
        ph = cls.producer_handlers
        if ph.has_key(producer_id):
            ccls = ph[producer_id]
            raise Exception("This producer already has a calculator: 
"+str(ccls))
        else:
            print "Registering "+str(cls)+" for producer_id=",producer_id
            ph[producer_id] = cls

    def __init__(cls,name,bases,dct):
        super(ProducerHandlerType,cls).__init__(cls,name,bases,dct)
        if hasattr(cls,'producer_id'):
            cls.registerProducerHandler(getattr(cls,'producer_id'))
        else:
            print "No producer_id for ",str(cls)
        

class A(ProducerHandlerType):
    pass

class B(A):
    producer_id = 1

class C(A):
    producer_id = 2

# Metaclass methods are not called above, and the line below prints an 
empty dict. :-(
print B.producer_handlers



More information about the Python-list mailing list