Тип object
является встроенным классом, написанным на C, и не позволяет добавлять к нему атрибуты. Это было четко закодировано, чтобы предотвратить это.
Самый простой способ получить такое же поведение в ваших собственных классах - это использовать атрибут __slots__
, чтобы определить список точных атрибутов, которые вы хотите поддерживать. Python зарезервирует место только для этих атрибутов и не позволит использовать другие.
class c(object):
__slots__ = "foo", "bar", "baz"
a = c()
a.foo = 3 # works
a.b = 3 # AttributeError
Конечно, есть некоторые предостережения с таким подходом: вы не можете выбрать такие объекты, и код, который ожидает, что у каждого объекта есть атрибут __dict__
, сломается. «Более Pythonic» способ будет использовать пользовательский __setattr__()
, как показано на другом плакате. Конечно, есть много способов обойти это, и никак не обойтись без установки __slots__
(кроме подклассов и добавления ваших атрибутов в подкласс).
В общем, это не то, что вам действительно нужно делать в Python. Если пользователь вашего класса хочет сохранить некоторые дополнительные атрибуты в экземплярах класса, нет причин не допускать их, и на самом деле есть много причин, по которым вы можете захотеть.