Python Language Question: attributes of object() vs Function

后端 未结 4 1097
南方客
南方客 2020-12-14 10:02

In python, it is illegal to create new attribute for an object instance like this

>>> a = object()
>>> a.hhh = 1

throws <

相关标签:
4条回答
  • 2020-12-14 10:38

    The rationale is that an instance of object() is a degenerate special case. It "is" an object but it isn't designed to be useful by itself.

    Think of object as a temporary hack, bridging old-style types and classes. In Python 3.0 it will fade into obscurity because it will no longer be used as part of

    class Foo( object ):
        pass
    
    f = Foo()
    f.randomAttribute = 3.1415926
    
    0 讨论(0)
  • 2020-12-14 10:40

    Here's another alternative, as short as I could make it:

    >>> dummy = type('', (), {})()
    >>> dummy.foo = 5
    >>> dummy.foo
    5
    
    0 讨论(0)
  • 2020-12-14 10:45

    Alex Martelli posted an awesome answer to your question. For anyone who is looking for a good way to accomplish arbitrary attributes on an empty object, do this:

    class myobject(object):
        pass
    
    o = myobject()
    o.anything = 123
    

    Or more efficient (and better documented) if you know the attributes:

    class myobject(object):
        __slots__ = ('anything', 'anythingelse')
    
    o = myobject()
    o.anything = 123
    o.anythingelse = 456
    
    0 讨论(0)
  • 2020-12-14 10:49

    The reason function objects support arbitrary attributes is that, before we added that feature, several frameworks (e.g. parser generator ones) were abusing function docstrings (and other attribute of function objects) to stash away per-function information that was crucial to them -- the need for such association of arbitrary named attributes to function objects being proven by example, supporting them directly in the language rather than punting and letting (e.g.) docstrings be abused, was pretty obvious.

    To support arbitrary instance attributes a type must supply every one of its instances with a __dict__ -- that's no big deal for functions (which are never tiny objects anyway), but it might well be for other objects intended to be tiny. By making the object type as light as we could, and also supplying __slots__ to allow avoiding per-instance __dict__ in subtypes of object, we supported small, specialized "value" types to the best of our ability.

    0 讨论(0)
提交回复
热议问题