关于 flask 底层 werkzeug 中 LocalProxy 的问题。

2016-01-04 14:01:48 +08:00
 aragakiiyui

class LocalProxy(object):

__slots__ = ('__local', '__dict__', '__name__')

def __init__(self, local, name=None):
    object.__setattr__(self, '_LocalProxy__local', local)
    object.__setattr__(self, '__name__', name)

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 (位于 werkzeug.local 模块中)中、、、_LocalProxy__local 的意思,
而且凭空出现一个 self.__local 方法,我猜测这两个是同一个东西,然后打印发现还真是,但是我没有在代码中发现把二者联系起来的逻辑,故上来问问有没有人知道这到底是怎么实现的。。

4147 次点击
所在节点    Python
5 条回复
clino
2016-01-04 14:15:04 +08:00
Zzzzzzzzz
2016-01-04 14:38:16 +08:00
python 没真正意义的 private, 约定俗成使用前置双下划线表示, 为了规避出问题, 实际上 cls.__prop 访问的是 cls._{cls.__class__.__name__}__prop, 和 flask 及 werkzeug 倒是没什么关系.
aec4d
2016-08-01 11:20:27 +08:00
接楼上,之所以不写 self.__local = local 、 setattr(self,'__local',local),是因为该对象重写了__setattr__方法。所以该处使用了 object.__setattr__
lanrenxu
2018-11-20 10:15:25 +08:00
二楼正解,三楼说的也很好,感谢!
liwb2
2019-07-07 19:17:51 +08:00
#3 正解。LocalProxy 重写了 __setattr__方法,已经不合适用 = 了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/248184

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX