【问题标题】:werkzeug's LocalProxy.__local, where is it initialized?werkzeug 的 LocalProxy.__local,它在哪里初始化?
【发布时间】:2020-06-26 17:24:30
【问题描述】:

我很好奇werkzeug 包中的LocalProxy 是如何工作的。具体来说,__local字段在哪里初始化?

@implements_bool
class LocalProxy(object):
    __slots__ = ("__local", "__dict__", "__name__", "__wrapped__")

    def __init__(self, local, name=None):
        object.__setattr__(self, "_LocalProxy__local", local)
        object.__setattr__(self, "__name__", name)
        if callable(local) and not hasattr(local, "__release_local__"):
            object.__setattr__(self, "__wrapped__", local)

    def _get_current_object(self):
        if not hasattr(self.__local, "__release_local__"):
            return self.__local()
        try:
            return getattr(self.__local, self.__name__)
        except AttributeError:
            raise RuntimeError("no object bound to %s" % self.__name__)

    ...

LocalProxy 类定义中没有其他地方引用self.__local,在我看来self.__local 没有在任何地方初始化。它是否以某种方式神奇地别名为self._LocalProxy__local

【问题讨论】:

  • 设置在__init__的第一行,即object.__setattr__(self, "_LocalProxy__local", local)

标签: python flask werkzeug


【解决方案1】:

你所称的aliasing在Python中被称为name mangling

举个例子:

class Customer:
    def __init__(self, name):
        self.__name = name

name 然后可以作为Customer._customer__name 使用。

虽然这确实很少使用,但其目的是让访问变得有点更难。无论出于何种原因,您都想要这个。

您的代码示例中另一个有趣的部分称为slots

这是一种以高级方式定义/初始化属性的方法。它有助于减少内存并防止动态定义新属性。

【讨论】:

    猜你喜欢
    • 2014-04-27
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2016-08-16
    相关资源
    最近更新 更多