[cctbxbb] boost python and metaclass inheritance

David Waterman dgwaterman at gmail.com
Tue Jan 7 05:27:35 PST 2014


Hi,

Does anyone know how to use __metaclass__ specification alongside
inheritance from boost python classes? This code illustrates the problem:

import abc
> from scitbx.lstbx import normal_eqns
>


class Refinery(object):
>   __metaclass__ = abc.ABCMeta
>   pass
>


class AdaptLstbx(Refinery, normal_eqns.non_linear_ls):
>   pass


The result is

Traceback (most recent call last):
>   File "<stdin>", line 1, in <module>
>   File "/usr/lib/python2.7/abc.py", line 87, in __new__
>     cls = super(ABCMeta, mcls).__new__(mcls, name, bases, namespace)
> TypeError: Error when calling the metaclass bases
>     metaclass conflict: the metaclass of a derived class must be a
> (non-strict) subclass of the metaclasses of all its bases


The real Refinery is a class that has one method that must be supplied by a
concrete subclass. I like the idea of making it impossible to instantiate a
base Refinery rather than relying on e.g. raise NotImplementedError() in
that method definition. This is what ABCMeta would give me, if only I could
get it to work here. Google found me some answers that require me to know
the __metaclass__ of the bases (as suggested by the error message),
but normal_eqns.non_linear_ls.__metaclass__ does not exist.

I don't terribly mind the raise NotImplementedError() alternative, but I
thought that if I can easily use ABCMeta, I'd like to.

Cheers

-- David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://phenix-online.org/pipermail/cctbxbb/attachments/20140107/4e93c7fa/attachment.htm>


More information about the cctbxbb mailing list