【问题标题】:Property functions out of class类外的属性函数
【发布时间】:2021-09-30 15:10:11
【问题描述】:

有没有办法在 Python 中拥有类似于属性但在类之外的东西?

可能是重复的,但我没有找到正确的答案。

这是一个解决的例子:

config = {'a':1}
config_a = some_function(config, 'a')

config_a  # eval as 1
config['a'] = 2
config_a  # eval as 2

使用类和属性,这很容易,但请注意,我必须在类外使用“a”。

Can modules have properties the same way that objects can?没有解决问题,因为涉及模块,没有解决上述问题。

更多上下文

我有一个 Flask 应用程序,它需要使用非 Flask 插件。 因此我有 2 个单独的配置对象:

  • 烧瓶:app.config (dict)
  • 扩展名:ext(对象,不是字典)

应用程序使用 app.config 加载通用配置和其他扩展配置。我想知道是否有一种简单的方法(不涉及猴子补丁)让 ext.config 值指向 app.config 值,所以我只需要处理一个配置文件。

# extension.py
class Extension()
    def __init__(self):
        self.a = "value_1"

# fix.py to use extension flask way
class MyExtension()
    def init_app(self, app):
        app.ext = Extension()
        app.config.setdefault('a', default_a)
        app.ext.a = some_function(app.config, 'a')

请注意,在上面的示例中,我无权访问 extension.py 将“a”更改为属性。

我可以使用猴子补丁将“a”转换为属性,但可能有更简单的方法。

【问题讨论】:

  • 为什么不直接使用dict呢?代码中的config 的行为完全类似于dict
  • Flask 使用一个 app.config,它是一个字典。但是,有一些不是“flask”的插件有自己的 config2。我希望 config2 指向 config1 中的值,所以我只需要担心 1 个配置字典。
  • 您尝试做的事情不应该做。以不同的方式解决您的问题。从您的描述中,我不太了解您的真正问题是什么,所以恐怕我无法提供任何建议-但是即使可能,对全局变量做一些黑魔法在道德上也是错误的,您可能会来世为此受到惩罚。
  • 这读起来就像你本质上想在 Python 中实现指针,这是在讨论 here
  • 很高兴知道这是不可能的。然后我会用你的评论信息回答我自己的问题。 @kaya3 感谢 eafterlife 的建议。

标签: python


【解决方案1】:

简答

指针未在 Python 中实现,因此不可能。 感谢@Robin Gertenbach 指点我 Pointers in Python?

但是

如果您有幸遇到我的上下文情况,则可以使用属性扩展原始类。它不能解决问题,但您必须以不同的方式解决问题:

# extension.py
class Extension()
    def __init__(self):
        self.a = "value_1"

# fix.py to use extension flask way
class Extension(extension.Extension):
    def __init__(self, app, *args, **kwargs):
        self.app = app
        super().__init__(*args, **kwargs)

    @property
    def a(self):
        return self.app.config['a']

    @a.setter
    def a(self, value):
        self.app.config['a'] = value

class MyExtension()
    def init_app(self, app):
        app.ext = Extension(app)

如果您尝试指向的变量不在一个类中,您可能可以将上面的代码与Can modules have properties the same way that objects can? 混合使用

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    相关资源
    最近更新 更多