Trying to get ABC to work

Boris Arloff boris.arloff at yahoo.com
Mon Aug 3 17:25:06 EDT 2009


Hi,
 
Looking for ideas on getting Abstract Base Classes to work as intended within a metaclass.
 
I was wondering if I could use an abc method within a metaclass to force a reimplementation when a class is instantiated from the metaclass.  It seems like I cannot do so.  I implemented the following test case:
 
import abc
class MetaExample(type):
  def __init__(cls, name, bases, ns):
    setattr(cls, 'cls_meth', cls.cls_meth)    # cls method as instance method
    setattr(cls, 'cls_abc', cls.cls_abc)        # abc cls method as instance method

 
  def cls_meth(cls):
    print('Class method defined stub')

 
  @abc.abstractmethod
  def cls_abc(cls):
    try:
      print('Class-Abstract method defined stub')
    except NotImplementedError, err:
      print('Must implement cls_abc.')
    except:
      print('General exception at cls_abc method.')
 
Then I create class MyKlass from the metaclass and instantiate it as myklass:
MyKlass(object): __metaclass__ = MetaExample
myklass = MyKlass()
myklass.cls_meth()   --> prints "Class method defined stub"
myklass.cls_abc()     --> prints "Class-Abstract method defined stub"
 
I was hopping for myklass.cls_abc() to print "Must implement cls_abc."
 
However, this makes sense since MyKlass implements from the metaclass the cls_abc method and there will never be an abstraction of this method.
 
Any ideas on how to get this done?  Any way I could define an abstract method within a metaclass and have it behave with abstraction when the class is created off the metaclass?
 
I other words, I want to force an implementation of cls_abc() method when MyKlass(object): __metaclass__ = MetaExample is declared, or else get NotImplementedError exception.
 
Thanks,
Boris Arloff
  


      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20090803/859a8c36/attachment.html>


More information about the Python-list mailing list