Python 是烧瓶';会话对象是dict还是对象?

Python 是烧瓶';会话对象是dict还是对象?,python,flask,Python,Flask,我注意到我可以将会话对象视为对象(session.myVal='foo')以及dict(session['myVal']='foo')。不能使用dict语法和object语法访问值集,反之亦然。使用会话对象的正确方法是什么?在Python中,类dict的属性getter和类object的属性getter都是通过神奇的方法实现的(以\uuuu开始和结束) 例如,您可以使用神奇的方法\uuuu getitem\uuuuuu和\uuuuuu setitem\uuuuu定义一个类似dict的对象: cl

我注意到我可以将
会话
对象视为对象(
session.myVal='foo'
)以及dict(
session['myVal']='foo'
)。不能使用dict语法和object语法访问值集,反之亦然。使用会话对象的正确方法是什么?

在Python中,类dict的属性getter和类object的属性getter都是通过神奇的方法实现的(以
\uuuu
开始和结束)

例如,您可以使用神奇的方法
\uuuu getitem\uuuuuu
\uuuuuu setitem\uuuuu
定义一个类似dict的对象:

class D:
    data = dict(attr1=1, attr2=2)

    def __getitem__(self, name):
        return self.data.get(name)

print D()['attr1']
class D:
    data = dict(attr1=1, attr2=2)

    def __getattr__(self, name):
        return self.data.get(name)

print D().attr1
或者,您可以使用
\uuuu getattr\uuuu
\uuuu setattr\uuuu
创建类似对象的属性getter类:

class D:
    data = dict(attr1=1, attr2=2)

    def __getitem__(self, name):
        return self.data.get(name)

print D()['attr1']
class D:
    data = dict(attr1=1, attr2=2)

    def __getattr__(self, name):
        return self.data.get(name)

print D().attr1
两个都可以。在本文中,您可以更深入地了解
\uuuu getattr\uuuu
\uuuu getattribute\uuuu
之间的区别。可以找到关于Python魔术方法的更多信息

在本例中,
session
对象是
werkzurg.local.LocalProxy
对象,这就是为什么它可以以两种方式使用

在我个人看来,这只是关于代码风格,我更喜欢
obj.attr
。这是因为,我认为IDE将更容易理解属性getter,并为我提供更好的提示支持。当重构时需要重命名属性时,这一点更为重要


更新:在
会话
的情况下,它确实有一些自定义属性,因此
会话['attr']
将是一个更安全的选择。

在Python中,类dict属性getter和类object属性getter都是通过神奇的方法实现的(以
\uuu
开始和结束)

例如,您可以使用神奇的方法
\uuuu getitem\uuuuuu
\uuuuuu setitem\uuuuu
定义一个类似dict的对象:

class D:
    data = dict(attr1=1, attr2=2)

    def __getitem__(self, name):
        return self.data.get(name)

print D()['attr1']
class D:
    data = dict(attr1=1, attr2=2)

    def __getattr__(self, name):
        return self.data.get(name)

print D().attr1
或者,您可以使用
\uuuu getattr\uuuu
\uuuu setattr\uuuu
创建类似对象的属性getter类:

class D:
    data = dict(attr1=1, attr2=2)

    def __getitem__(self, name):
        return self.data.get(name)

print D()['attr1']
class D:
    data = dict(attr1=1, attr2=2)

    def __getattr__(self, name):
        return self.data.get(name)

print D().attr1
两个都可以。在本文中,您可以更深入地了解
\uuuu getattr\uuuu
\uuuu getattribute\uuuu
之间的区别。可以找到关于Python魔术方法的更多信息

在本例中,
session
对象是
werkzurg.local.LocalProxy
对象,这就是为什么它可以以两种方式使用

在我个人看来,这只是关于代码风格,我更喜欢
obj.attr
。这是因为,我认为IDE将更容易理解属性getter,并为我提供更好的提示支持。当重构时需要重命名属性时,这一点更为重要


更新:对于
会话
,它确实有一些自定义属性,因此
会话['attr']
将是一个更安全的选择。

在会话上设置值的唯一有效方法是将会话视为字典(
会话[key]=value
)。dict项将在请求之间保留。有关更多信息,请参阅

会话是一个普通的Python类实例,因此在其上设置属性是完全有效的,但是这些属性不会影响实际的会话数据,它们只会在请求结束时消失


您可以自己验证这一点:在会话上设置一个属性(
session.xyz='123'
),然后尝试在后续请求中打印出来(
print(session.xyz)
),您将得到一个
AttributeError

在会话上设置值的唯一有效方法是将会话视为字典(
session[key]=值
)。dict项将在请求之间保留。有关更多信息,请参阅

会话是一个普通的Python类实例,因此在其上设置属性是完全有效的,但是这些属性不会影响实际的会话数据,它们只会在请求结束时消失

您可以自己验证这一点:在会话上设置一个属性(
session.xyz='123'
),然后尝试在后续请求中打印它(
print(session.xyz)
),您将得到一个
AttributeError