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
--
http://mail.python.org/mailman/listinfo/python-list