Почему я не могу назначить необъявленным атрибутам экземпляра object(), но могу это сделать с помощью пользовательских классов?

В основном я хочу знать, почему это работает:

class MyClass:
  pass

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

Но это возвращает AttributeError:

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

Как я могу сказать, с какими классами я могу использовать неопределенные атрибуты, а с какими - нет?

Благодарю.

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'
>>>
Другие вопросы по тегам