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
)