← Back to team overview

dolfin team mailing list archive

Re: pyDolfin Function inheritance

 

On Fri, Jan 30, 2009 at 2:42 PM, Johan Hake <hake@xxxxxxxxx> wrote:

> On Friday 30 January 2009 13:05:45 Evan Lezar wrote:
> > Hi
> >
> > I have been away from my work for a while and am now trying to get my
> code
> > working with the new dolfin including the concept of a FunctionSpace.  I
> am
> > mostly working in Python.
> >
> > Consider the following python class
> >
> >
> > *class MyFunction(Function):
> >     def __init__(self, V, other_param):
> >         Function.__init__(self, V)
> >         self.set_other_param(other_param)
> >
> >     def set_other_param(self, param):
> >         self._other_param = param*
> >
> > *    def get_other_param(self):
> >         return self._other_param
> > *
> >
> > The problem I have is that the code above (which worked up until now)
> > results in the following error
> >
> >  File "/usr/local/lib/python2.5/site-packages/dolfin/cpp.py", line 5528,
> in
> > <lambda>
> >     __getattr__ = lambda self, name: _swig_getattr(self, Function, name)
> >   File "/usr/local/lib/python2.5/site-packages/dolfin/cpp.py", line 34,
> in
> > _swig_getattr
> >     raise AttributeError,name
> > AttributeError: set_other_param
> >
> > From what I can tell, the methods set_other_param and get_other_param are
> > being handled using swig and not by calling the python methods as I would
> > expect.
> >
> > I must be overlooking something in the new implementation, so if someone
> > could point me in the right direction it would be much appreciated.
>
> Hello Evan!
>
> I agree that this looks a bit strange, and I am really not sure what
> happens.
>
> Two things to try:
>  1) When you define your own __init__ do not call Function.__init__. This
> is
> done behind the scens anyway.
>
> The thing is that we dynamically create a python class behinds the scenes,
> (using metaclasses). This class inherit from both FFC.Function,
> cpp.Function
> (The dolfin compiled version) and dolfin.Function. This makes the call to
> Function.__init__ in your __init__ function possible ambigious.
>
> This is not what you expect as a experienced python user so we should
> consider
> putting in some warnings here. Will look into it...
>
> 2) Is it possible for you to use the compiled function interface?
>
> You should be able to set simple optional parameters here too.
> A very simple example would be:
>
>   >>> f = Function(V,'A*sin(x[0])',{'A':4.5})
>   >>> f.A
>   4.5
>   >>> f.A = 5.6
>
> You can also compile more complex logics with more attributes other than
> float
> or int. See the docstring of Function user case 3)
>
> Johan
>

Thanks for the reply Johan.

I will have a look at the use of the simple parameters and study the
docstring again.  Will let you know what I come up with.

Evan

References