После собственного дескриптора атрибут отсутствует в __dict__

Я хотел бы добавить к атрибутам объекта в Python некоторую информацию. Позже я хотел бы сохранить эти данные в БД, поэтому было бы неплохо узнать их формат в таблицах. Я думаю, что решение от SQLAlchemy хорошее, и я хотел бы сделать это так.

Сначала краткий пример:

class MyAttribute(object):

    def __init__(self, AttrType):
        self.val = None
        self.AttrType = AttrType

    def __get__(self, obj, objtype):
        return self.val

    def __set__(self, obj, val):
        self.val = val


class MyClass(object):

    Attr1 = MyAttribute('int(11)')

    def __init__(self):
        self.Attr1 = 44
        self.Attr2 = 55


x = MyClass()

print("Attr1: %s"%x.Attr1)
print("Attr2: %s"%x.Attr2)

print(x.__dict__)

Результат этого сценария:

Attr1: 44
Attr2: 55

{'Attr2': 55}

Теперь моя проблема: в __dict__, есть Attr2, но нет Attr1, Зачем? Как я могу добавить это? Какая функция отвечает за это? (Мое чтение __set__, правильно?) Что мне нужно добавить, куда добавить объект атрибута к dict?

1 ответ

Решение

Пытаться MyClass.__dict__:

>>> MyClass.__dict__['Attr1']
<__main__.MyAttribute object at 0x000000000296A5F8>

Дескрипторы хранятся в объекте класса, а не в объекте экземпляра. Вы на самом деле в беде здесь, по этой причине:

>>> x = MyClass()
>>> x.Attr1
44
>>> y = MyClass()
>>> y.Attr1 = 66
>>> y.Attr1
66
>>> x.Attr1
66 # uh oh

Задача MyAttribute - отслеживать, какие данные принадлежат какому экземпляру.

Другие вопросы по тегам