私はいくつかのsqlalchemyモデルのかなり複雑な基本クラスを持っており、railsスタイルのセッターを作成したいのですが、Pythonはかなり新しいので、バイパスできないような問題に悩まされています。新しいメソッドでセッターを作成して、新しいインスタンスとクエリの両方でトリガーできるようにしますが、どのセッターを定義して実行しても、常に最後に実行するセッターを選択します。例の方が適しています。
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')
ご覧のとおり、私は電子メールを設定していますが、実行されると、コードは最後の列であるユーザー名を設定しようとします。それはなぜですか?