2013-03-08 2 views
1

Я испытывал динамическое назначение атрибутов для целей тестирования и обнаружили следующее поведение:Динамического атрибут назначение

>>> class Foo(object): pass 
... 
>>> bar = Spam() 
>>> bar.a = 1 
>>> spam = object() 
>>> spam.a = 2 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
AttributeError: 'object' object has no attribute 'a' 

Почему первая версия с производным классом законна, но второе прямым использование object не ? Мне кажется немного странным, потому что вывод не изменил ничего, что явно имеет отношение к тому, как обрабатывается переменная.

+0

Этот вопрос может помочь: http://stackoverflow.com/q/1285269/1015178 –

+0

Согласен. Я недостаточно тщательно проверял существующий вопрос. – phineas

ответ

2

Это потому, что object является родным типом, что означает, что он реализован в коде C и не поддерживает динамическое назначение атрибутов по соображениям производительности. То же самое можно сказать и для большинства родных классов Python, таких как str или int.

Но Python позволяет подклассифицировать любой родной тип, а ваши подклассы поддерживают динамическое назначение.

Вы также можете отключить его по соображениям производительности на своих классах, используя специальный атрибут __slots__.

1

object экземпляры не имеют __dict__.

>>> hasattr(object(), '__dict__') 
False 

И, следовательно, у них не могут быть добавлены атрибуты.