[Numpy-discussion] subclassing float64 (and friends)

Stefan van der Walt stefan at sun.ac.za
Wed Jan 3 07:44:45 EST 2007


On Wed, Jan 03, 2007 at 04:29:10AM -0600, eric jones wrote:
> I am playing around with sub-classing the new-fangled float64 objects 
> and friends.  I really like the new ndarray subclassing features 
> (__array_finalize__, etc.), and was exploring whether or not the scalars 
> worked the same way.  I've stubbed my toe right out of the blocks 
> though.  I can sub-class from standard python floats just fine, but when 
> I try to do the same from float64, I get a traceback. (examples below)  
> Anyone have ideas on how to do this correctly?
> 
> from numpy import float64
> 
> class MyFloat2(float64):
> 
>     def __new__(cls, data, my_attr=None):
>         obj = float64.__new__(cls, data)
>         obj.my_attr = my_attr
>         return obj
> 
> a = MyFloat2(1.2,my_attr="hello")
> print a, a.my_attr
> 
> 
> output:
>     Traceback (most recent call last):
>       File "C:\wrk\eric\trunk\src\lib\geo\examples\scalar_subtype.py", 
> line 33, in ?
>         a = MyFloat2(1.2,my_attr="hello")
>       File "C:\wrk\eric\trunk\src\lib\geo\examples\scalar_subtype.py", 
> line 30, in __new__
>         obj.my_attr = my_attr
>     AttributeError: 'numpy.float64' object has no attribute 'my_attr'

With classes defined in C I've often noticed that you can't add
attributes, i.e.

f = N.float64(1.2)
f.x = 1

breaks with

AttributeError: 'numpy.float64' object has no attribute 'x'

The way to fix this for arrays is to first view the array as the new
subclass, i.e.

x = N.array([1])
class Ary(N.ndarray):
    pass
x = x.view(Ary)
x.y = 1

However, with floats I noticed that the following fails:

import numpy as N
f = N.float64(1.2)
class Floaty(N.float64):
    pass
f.view(Floaty)

with

TypeError: data type cannot be determined from type object

Maybe this is part of the problem?

Regards
Stéfan



More information about the NumPy-Discussion mailing list