Я пишу веб-сайт генератор с различными классами, которые представляют содержание веб-страниц, таких как Page
, NewsPost
, Tag
, Category
и т.д.Контекстуально инъекционные статические свойства класса в Python
Я хотел бы быть в состоянии строить эти объекты прямо, и у меня нет проблем с этим.
Однако я также хотел бы построить эти объекты в определенном контексте - скажем, в контексте веб-сайта с определенным корневым URL-адресом. Предположим, я помещал этот контекст в экземпляр класса ContentManager
. Это код, который я в конечном счете, надеюсь, что в конечном итоге с:
page = Page(title='Test Page', content='hello world!')
assert page.cm == None
cm = ContentManager(root_url='//localhost')
page = cm.Page(title='Test Page', content='hello world!')
assert page.cm == cm
я могу легко справиться с этим, если page.cm
это свойство за инстанции установлено в __init__
, но мне нужно, чтобы вызывать методы класса на cm.Page
, которые нуждаются в доступе к cm
, поэтому он должен быть статическим свойством.
Если бы я просто установить его в качестве статического свойства на Page
класса, он будет в конечном итоге влияет на другиеContentManager
сек страницы, а также, что не желательно.
Как бы я мог достичь этого? Метаклассы? Или какой-то классной фабричной функции?
Вы либо делаете его экземпляром, либо атрибутом/свойством класса, нет других вариантов, даже если вы вводите магию метакласса. Скорее всего, вам нужен атрибут экземпляра, и некоторые из вашего кода должны быть перемещены из методов класса в методы экземпляра, чтобы иметь доступ к этим переменным экземпляра. – pasztorpisti
Перенос переменных (неконстантных данных) в статические/глобальные/общие/любые места - это плохая практика вообще (даже на других языках программирования). Обычно это указывает на неподходящий дизайн, который нуждается в переосмыслении. – pasztorpisti
Я действительно думаю, что вы правы, но учитывая (недостаток) важность и небольшой объем проекта, я решил, что это будет стоить того, если бы это было осуществимо. – Andreas