对于某些 sqlalchemy 模型,我有一个相当复杂的基类,我想创建一个 rails 样式的设置器,但是,由于我对 python 还很陌生,所以我遇到了一个我似乎无法绕过的问题。我在新方法上创建了 setter,因此我可以在新实例和查询上触发,但无论我定义和执行什么 setter,它总是选择最后一个 setter 来执行。一个例子更好:
class Test(object):
columns = ['email', 'username']
def __new__( cls, *args, **kwargs ):
for column in cls.columns:
setattr( cls, "set%s" % column.capitalize(), lambda cls, v: cls.setAttribute( cls, column, v ) )
return super( Test, cls ).__new__( cls, *args, **kwargs )
@staticmethod
def setAttribute(cls, attribute, value):
print "Setting attribute %s with value %s" % ( attribute, value )
setattr( cls, attribute, value )
test = Test()
test.setEmail('test@test.com')
如您所见,我正在设置电子邮件,但是在执行时,代码会尝试设置作为最后一列的用户名。知道为什么吗?