Назначение атрибута встроенному объекту

Это работает:

class MyClass(object): pass someinstance = MyClass() someinstance.myattribute = 42 print someinstance.myattribute >>> 42 

Но это не так:

 someinstance = object() someinstance.myattribute = 42 >>> AttributeError: 'object' object has no attribute 'myattribute' 

Зачем? У меня такое чувство, что это связано с тем, что объект является встроенным классом, но я нахожу это неудовлетворительным, так как ничего не изменил в объявлении MyClass.

4 Solutions collect form web for “Назначение атрибута встроенному объекту”

Python хранит атрибуты в dict. Вы можете добавлять атрибуты в MyClass , см. __dict__ :

 >>> class MyClass(object): >>> pass >>> dir(MyClass) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] 

Важное различие заключается в том, что object не имеет атрибута __dict__ .

 >>> dir(object) ['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

Более подробные объяснения:

  • Невозможно установить атрибуты класса объектов
  • Почему вы не можете добавлять атрибуты к объекту в python?

Что касается обоснования этого, слова самого БДФЛ :

Это запрещено преднамеренно предотвращать случайные фатальные изменения во встроенных типах (фатальные для частей кода, которые вы никогда не имели). Кроме того, это делается для того, чтобы изменения не влияли на разных интерпретаторов, проживающих в адресном пространстве, поскольку встроенные типы (в отличие от пользовательских классов) распределяются между всеми такими интерпретаторами.

 >>> type(object) type 'type' >>> type(MyClass) type 'classobj' 

Здесь важным отличием является MyClass – пользовательский объект класса. Где вы можете изменить свой класс.

object() однако является объектом класса __builtin__ .

Когда вы наследуете объект, который является вашим базовым классом, а также __builtin__ , вы можете изменить только свой новый MyClass который вы определили.

Для пользовательских классов установка атрибута объекта фактически изменяет словарь атрибутов, поэтому вы можете добавить новую запись в любое время. (Объект __dict__ )

Атрибуты встроенных типов реализованы по-разному, а не как общий словарь, а непосредственно как макет памяти основной реализации. Поскольку словарь не существует, и класс не может быть изменен во время выполнения, вы не можете добавлять новые значения атрибутов во встроенные объекты.

Пожалуйста, посмотри:

http://webcache.googleusercontent.com/search?q=cache:z4to2IGbKDUJ:www.velocityreviews.com/forums/t593269-cant-set-attributes-of-built-in-extension-type.html+setattr+built+ в + классе & CD = 3 & гл = еп & кт = CLNK и гл = мы и клиент = светлячок-а и источник = http://www.google.com

http://mail.python.org/pipermail/python-dev/2008-February/077180.html

http://mail.python.org/pipermail/python-list/2010-April/1240731.html

  • Как инициализировать вложенные словари в Python
  • Зачем вставлять __init __ () суперкласса в этом случае?
  • Python: несколько вызовов __init __ () в одном экземпляре
  • Python: создание экземпляра класса без вызова инициализатора
  • setattr с kwargs, pythonic или нет?
  • Python - Инициализация нескольких списков / строк
  • Инициализация членов класса Python
  • Как инициализировать целочисленный объект array.array с нулями в Python
  • Лучший способ инициализировать и заполнить массив numpy?
  • Инициализировать список с одинаковым значением bool
  • Открыть файл в __init __ () python
  • Python - лучший язык программирования в мире.