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

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

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 - Инициализация нескольких списков / строк
  • В чем разница между конструктором и инициализатором в python?
  • Что-то не так с действительно большим __init__?
  • Как выполнять общие задачи после инициализации в унаследованных классах Python?
  • Что может `__init__` делать, что` __new__` не может?
  • setattr с kwargs, pythonic или нет?
  • Открыть файл в __init __ () python
  •  
    Interesting Posts for Van-Lav

    Отображение номеров строк в IPython / Jupyter Notebooks

    Python sleep () запрещает печать запятой?

    Статические файлы Tornado, обслуживающие конфигурацию URL-адреса

    Байтовый предел при передаче объектов Python между процессами с использованием Pipe?

    Как сделать столбцы Tkinter равной ширины, когда виджеты охватывают несколько столбцов (Python 2.7)

    Обнаружение Интернета для конкретного интерфейса через Python

    Нарисуйте другой цвет для узлов в сетиx на основе их значения узла

    Что может быть причиной «недопустимого значения, встречающегося в less_equal» в numpy

    Является ли это эффективным и путинским способом увидеть, является ли какой-либо элемент в итерабельном истинным для определенного атрибута?

    Python и отладчик Pydev?

    Как получить учетные данные python-social-auth для google drive sdk?

    Вызывать pstools в скрипте Python

    Сравнение двух типов классов в python

    Объединение двух таблиц с миллионами строк в Python

    кортеж кортежей dict из базы данных mysql

    Python - лучший язык программирования в мире.