我试图使用hybrid_property装饰器来定义getter/setter。这是密码。
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将产生以下结果
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
发布于 2014-02-21 17:09:46
最初的模型是使用经典映射风格。重构模型以使用声明式映射样式解决了问题。我猜混合属性只在类使用声明基时才能工作。
发布于 2014-02-18 15:35:54
我还没有对SQLAlchemy代码进行足够深入的研究,无法确定这就是问题所在,但我敢打赌,您使用的属性是错误的。set_password应该被称为password。我打赌它会解决你的问题,但即使没有,你也需要这样做。看这个例子。
您将看到使用内置@property装饰器的相关错误。请记住,修饰符只是用于分配函数的结果的缩写,该函数接受并返回本地命名空间中修饰函数的标签。您在这里所做的是创建一个可调用的,并将其分配给password,然后创建一个新的可调用的包包装password可调用,并将其分配给set_password。您在评论中提到,它适用于较早版本的SQLAlchemy。我敢打赌,在使用my_var.setter时,他们从修改包装的可调用对象切换到返回新实例。如果您要使用set_password,它很可能会像您期望的password那样工作。
发布于 2015-05-22 21:08:32
这不起作用的原因是(我怀疑),因为您在测试该属性,就好像它是一个方法一样。从您的测试代码:user.test() (我假设在某些版本的代码中,password被称为test )。
如果您执行user.password('changeme'),那么它将无法工作,因为user.password不是一种方法。相反,应该是:user.password = 'changeme'
我认为切换到声明基础很可能只是一个巧合。
https://stackoverflow.com/questions/21858127
复制相似问题