在Python中上下文注入静态类属性

安德烈亚斯(Andreas)

我正在写与代表的网页,如内容的各种类网站发生器PageNewsPostTagCategory等。

我希望能够简单地构造这些对象,对此我没有任何问题。

但是,我也想在特定的上下文中构造这些对象-例如,具有特定根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

一种解决方案是Page为每个ContentManage实例创建的子类

class Page:
    cm = None

    def __init__(self, title, content):
        self.title = title
        self.content = content


class ContentManager:
    def __init__(self, root_url):
        class PerContentManagerPage(Page):
            cm = self

        self.Page = PerContentManagerPage


page0 = Page(title='Test Page', content='hello world!')

cm = ContentManager(root_url='//localhost')
page = cm.Page(title='Test Page', content='hello world!')

cm2 = ContentManager(root_url='//localhost')
page2 = cm2.Page(title='Test Page 2', content='hello world!')

assert page0.cm is None
assert page.cm == cm
assert page2.cm == cm2

在python中,类也是对象(其元类的实例)。此解决方案在Page每次实例化都会创建一个新的子类ContentManager这意味着cm.Page该类与cm2.Page该类不同,但两者都是的子类Page这就是为什么cm.Page.cm可能cm2.Page.cm具有不同的值的原因,因为它们是两个单独的类(或类对象)。

注意:尽管在python中,这可以通过动态创建子类对象来解决,但问题通常具有更好的解决方案。动态创建类/子类是一个警告标志(HACK)。

我仍然坚信您不应该为每个内容管理器实例创建一个页面子类。取而代之的是,我将简单地使用全局实例ContentManagerPage类的实例,方法是通过适当的方式将它们与彼此的引用连接起来,并将数据和代码放入实例属性/方法中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

构造函数中上下文类的依赖注入

来自分类Dev

注入静态属性值

来自分类Dev

如何从子上下文访问类属性

来自分类Dev

如何从子上下文访问类属性

来自分类Dev

具有类属性的 Xamarin 绑定上下文

来自分类Dev

Specflow上下文注入

来自分类Dev

Python静态类属性

来自分类Dev

QQuickWindow上下文属性?

来自分类Dev

如何使用@Value将属性值注入静态字段

来自分类Dev

python中上下文管理器的目的是什么

来自分类Dev

如何从测试中注入上下文

来自分类Dev

上下文注入和BeforeFeature挂钩

来自分类Dev

IWebDriver的Specflow上下文注入失败

来自分类Dev

上下文未正确注入

来自分类Dev

上下文注入和BeforeFeature挂钩

来自分类Dev

IWebDriver的Specflow上下文注入失败

来自分类Dev

NullPointerException上下文静态方法

来自分类Dev

我的静态上下文在哪里?

来自分类Dev

Android-静态上下文

来自分类Dev

在静态方法中丢失上下文

来自分类Dev

ddd中上游上下文和下游上下文之间的关系

来自分类Dev

不了解Java EE中上下文的概念

来自分类Dev

如何在HTML上下文中上传文件

来自分类Dev

把手中上下文中的渲染模板

来自分类Dev

以下示例中上下文的奇怪变化

来自分类Dev

C 中上下文中的 Valgrind 错误

来自分类Dev

Python异步上下文

来自分类Dev

将数据库上下文注入自定义属性.NET Core

来自分类Dev

MVC-调用上下文(EF)抛出异常的简单注入器和属性