【发布时间】:2010-09-06 22:42:39
【问题描述】:
基本上我想知道为什么会这样:
class MyClass:
pass
myObj = MyClass()
myObj.foo = 'a'
但这会返回一个 AttributeError:
myObj = object()
myObj.foo = 'a'
我如何知道哪些类可以使用未定义的属性,哪些不能?
谢谢。
【问题讨论】:
基本上我想知道为什么会这样:
class MyClass:
pass
myObj = MyClass()
myObj.foo = 'a'
但这会返回一个 AttributeError:
myObj = object()
myObj.foo = 'a'
我如何知道哪些类可以使用未定义的属性,哪些不能?
谢谢。
【问题讨论】:
您可以使用__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'
>>>
【讨论】:
__dict__ 的情况下创建类(如果您期望大量 个实例,通常用于提高内存效率。