【问题标题】:Why can't I assign to undeclared attributes of an object() instance but I can with custom classes?为什么我不能分配给 object() 实例的未声明属性,但我可以使用自定义类?
【发布时间】:2010-09-06 22:42:39
【问题描述】:

基本上我想知道为什么会这样:

class MyClass:
  pass

myObj = MyClass()
myObj.foo = 'a'

但这会返回一个 AttributeError:

myObj = object()
myObj.foo = 'a'

我如何知道哪些类可以使用未定义的属性,哪些不能?

谢谢。

【问题讨论】:

    标签: python class-structure


    【解决方案1】:

    您可以使用__dict__ 为任何类设置属性,因为这是存储它们的位置。 object 实例(很奇怪)和任何定义 __slots__ 的类都没有:

    >>> class Foo(object): pass
    ...
    >>> foo = Foo()
    >>> hasattr(foo, "__dict__")
    True
    >>> foo.bar = "baz"
    >>>
    >>> class Spam(object):
    ...     __slots__ = tuple()
    ...
    >>> spam = Spam()
    >>> hasattr(spam, "__dict__")
    False
    >>> spam.ham = "eggs"
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Spam' object has no attribute 'ham'
    >>>
    

    【讨论】:

    • 即,任何用户定义的类都可以
    • @pberkes:不,您可以在没有__dict__ 的情况下创建类(如果您期望大量 个实例,通常用于提高内存效率。
    猜你喜欢
    • 2015-07-16
    • 2011-08-16
    • 2017-07-20
    • 2020-01-11
    • 2012-08-04
    • 1970-01-01
    • 2014-07-08
    • 2011-01-09
    相关资源
    最近更新 更多