Справка по метапрограммированию на Python - PullRequest
0 голосов
/ 07 мая 2010

я изучаю mongoengine, и я хотел сделать класс "EmbeddedDocument" динамически, поэтому я делаю это

def custom(cls):
    cls = type( cls.__name__, (EmbeddedDocument,), cls.__dict__.copy() )
    cls.a = FloatField(required=True)
    cls.b = FloatField(required=True)
    return cls

A = custom( A )

и попробовал его на некоторых классах, но он не выполняет инициализацию или суммирование базового класса

в базовом документе

def __init__(self, **values):
    self._data = {}
    # Assign initial values to instance
    for attr_name, attr_value in self._fields.items():
        if attr_name in values:
            setattr(self, attr_name, values.pop(attr_name))
        else:
            # Use default value if present
            value = getattr(self, attr_name, None)
            setattr(self, attr_name, value)

но это никогда не используется, таким образом никогда не устанавливая ._data и выдавая мне ошибки. как мне это сделать?

Обновление:

Я играю с ним больше, и, похоже, есть проблема с классами с init методами. может мне нужно сделать это явным?

1 Ответ

2 голосов
/ 07 мая 2010

Класс, который вы создаете, не является подклассом cls.Вы можете добавить EmbeddedDocument, но вам все еще нужно создать подклассы оригинала, чтобы получить методы родителя (например, __init__).

cls = type(cls.__name__, (cls, EmbeddedDocument), {'a': FloatField(required=True), 'b': FloatField(required=True)})

РЕДАКТИРОВАТЬ: вы можете поставить 'a' и 'b'атрибуты прямо в атрибуте dict, переданном type()

...