Trying to get ABC to work
Roman
r.a.teterin at gmail.com
Tue Aug 4 13:08:45 EDT 2009
Following code works, although I'm not sure that it's exactly what you
want:
import abc
class MetaExample(abc.ABCMeta):
def __new__(mcs, name, bases, ns):
ns['cls_meth'] = mcs.cls_meth
if not 'cls_abc' in ns:
ns['cls_abc'] = mcs.cls_abc
return super().__new__(mcs, name, bases, ns)
def cls_meth(cls):
print('Class method defined stub')
@abc.abstractmethod
def cls_abc(cls):
try:
print('Class-Abstract method defined stub')
except NotImplementedError as err:
print('Must implement cls_abc')
except:
print('General exception at cls_abc method')
That's how I've tested it:
class Test1(object, metaclass=MetaExample):
def cls_abc(self):
print("method of", self)
class Test2(object, metaclass=MetaExample): pass
test1 = Test1()
test1.cls_meth()
test1.cls_abc()
test2 = Test2()
Output:
Class method defined stub
method of <__main__.Test1 object at 0xb7b5f52c>
Traceback (most recent call last):
File "/tmp/test.py", line 32, in <module>
test2 = Test2()
TypeError: Can't instantiate abstract class Test2 with abstract methods cls_abc
According to the documentation, @abstractmethod "requires that the
metaclass is ABCMeta or derived from it", so I've changed base class
from type to ABCMeta. Also I don't think that using try/except inside the
abstract method will work, maybe it would be better to check presence of
all required methods directly inside the metaclass, without
@abstractmethod decorator.
More information about the Python-list
mailing list