Атрибуты собственности фабричного мальчика? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть такой рецепт:

import factory
from models import Foobar


class MenuItemFactory(factory.Factory):
    class Meta:
        model = MenuItem

    name = 'Default Foobar'
    url = factory.LazyAttribute(lambda o: '/%s' % o.name)

Я хочу добавить динамические свойства, такие как slug, но я хочу сделать это отдельным методом. Я хочу этого, так как написание какой-либо более сложной логики в лямбда-однострочниках было бы, ну, некрасиво.

Одна мысль пришла на ум, используя метод property, как они делают в моделях Django. Например:

class MenuItemFactory(factory.Factory):
    ...

    @property
    def url(self):
        return '/%s' % self.name

Есть ли способ, похожий на этот, который достигнет того, что я пытаюсь сделать?

EDIT

Что я хочу достичь в итоге, так это:

menu_item = MenuItemFactory(name='foobar')

menu_item.name = 'foobar'
menu_item.url = '/foobar'

Где slug действует как динамический атрибут. Другими словами, я ищу подходящее место для хранения моей логики динамических атрибутов .

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

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

@factory.lazy_attribute
def url(self):
    return '/%s' % self.name
0 голосов
/ 27 августа 2018

Вы можете использовать свойство buildin https://docs.python.org/3.6/library/functions.html#property

class Test:
    name = 'bar'

def fget(self):
    return self.name

def fset(self, name):
    self.name = name

Test.slug = property(fget=fget, fset=fset)
t = Test()
print(t.slug)    # 'bar'
t.slug = 'foo'
print(t.slug)    # 'foo'
...