can't set attributes of built-in/extension type
Steve Holden
steve at holdenweb.com
Thu Feb 21 15:19:08 EST 2008
Neal Becker wrote:
> 7stud wrote:
>
>> On Feb 21, 11:19 am, Neal Becker <ndbeck... at gmail.com> wrote:
>>> I'm working on a simple extension. Following the classic 'noddy'
>>> example.
>>>
>>> In [15]: cmplx_int32
>>> Out[15]: <type 'numpy.cmplx_int32'>
>>>
>>> Now I want to add an attribute to this type. More precisely, I want a
>>> class attribute.
>>>
>>> cmplx_int32.test = 0
>>> ---------------------------------------------------------------------------
>>> TypeError Traceback (most recent call
>>> last)
>>>
>>> /home/nbecker/numpy/<ipython console> in <module>()
>>>
>>> TypeError: can't set attributes of built-in/extension
>>> type 'numpy.cmplx_int32'
>>>
>>> What am I missing?
>>
>> class Dog(object):
>> def __setattr__(self, attr, val):
>> print "TypeError: can't set attributes of built-in/extension"
>> print "type 'Dog.cmplx_int32'"
>>
>> d = Dog()
>> d.test = 0
>>
>> --output:--
>> TypeError: can't set attributes of built-in/extension
>> type 'Dog.cmplx_int32'
>
> Not quite, I'm setting a class attribute, not an attribute on an instance.
>
Quite. The problem is that extension types' attributes are determined by
the layout of the object's slots and forever fixed in the C code that
implements them: the slots can't be extended, so there's no way to add
attributes. This is an efficiency feature: it would be *extremely* slow
to look up the basic types' attributes using late-binding (it would also
change the nature of the language somewhat, making it more like Ruby or
Self).
So the reason you can't do what you want to is the same reason why you
can't add attribute to the built-in types (which are, of course, clearly
mentioned in the error message).
>>> object.anyoldname = "You lose!"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't set attributes of built-in/extension type 'object'
>>>
If you look in typeobject.c you'll find this error message occurs when
the object's type isn't a PyHeapTypeObject (in other words, if it's one
of the built-in or extension types).
regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC http://www.holdenweb.com/
More information about the Python-list
mailing list