首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置SQLAlchemy hybrid_property错误

设置SQLAlchemy hybrid_property错误
EN

Stack Overflow用户
提问于 2014-02-18 15:27:04
回答 4查看 1.5K关注 0票数 0

我试图使用hybrid_property装饰器来定义getter/setter。这是密码。

代码语言:javascript
复制
class Users(object):
def __init__(self, username, uid=None, password=None, group_uid=None):
    self.uid = uid
    self.username = username
    self.password = password
    self.group_uid = group_uid

def __repr__(self):

    return "User(%(username)s)" % self.__dict__

@hybrid_property
def password(self):

    return self._password

@password.setter
def set_password(self, password):       

    self._password = password

查看用户对象时,getter工作正常( user.password返回一个字符串,但调用setter将产生以下结果

代码语言:javascript
复制
user.test('test')
Traceback (most recent call last):
  File "--removed--", line 35, in exec_expr
    exec code in self.namespace, self.globs
  File "<web>", line 1, in <module>
TypeError: 'str' object is not callable

如果你能帮我指出我错过的东西,我将不胜感激。

PS。使用SQLAlchemy版本0.9.1

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-02-21 17:09:46

最初的模型是使用经典映射风格。重构模型以使用声明式映射样式解决了问题。我猜混合属性只在类使用声明基时才能工作。

票数 1
EN

Stack Overflow用户

发布于 2014-02-18 15:35:54

我还没有对SQLAlchemy代码进行足够深入的研究,无法确定这就是问题所在,但我敢打赌,您使用的属性是错误的。set_password应该被称为password。我打赌它会解决你的问题,但即使没有,你也需要这样做。看这个例子。

您将看到使用内置@property装饰器的相关错误。请记住,修饰符只是用于分配函数的结果的缩写,该函数接受并返回本地命名空间中修饰函数的标签。您在这里所做的是创建一个可调用的,并将其分配给password,然后创建一个新的可调用的包包装password可调用,并将其分配给set_password。您在评论中提到,它适用于较早版本的SQLAlchemy。我敢打赌,在使用my_var.setter时,他们从修改包装的可调用对象切换到返回新实例。如果您要使用set_password,它很可能会像您期望的password那样工作。

票数 1
EN

Stack Overflow用户

发布于 2015-05-22 21:08:32

这不起作用的原因是(我怀疑),因为您在测试该属性,就好像它是一个方法一样。从您的测试代码:user.test() (我假设在某些版本的代码中,password被称为test )。

如果您执行user.password('changeme'),那么它将无法工作,因为user.password不是一种方法。相反,应该是:user.password = 'changeme'

我认为切换到声明基础很可能只是一个巧合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21858127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档