SQLObject创建了形如_set_lastName的方法定义你的列,当时当你再次想要使用时却发现父类没有相关引用(即不可以写SQLObject._set_lastName(...),因为SQLObject类并不知道你的类的列)。你需要自己重载_set_lastName方法。 为了处理这种问题,SQLObjec类创建了两个方法作为getter和setter,例如:_set_lastName和_SO_set_lastName。所以可以截获所有对lastName的更改: class Person(SQLObject): lastName=StringCol() firstName=StringCol() def _set_lastName(self,value): self.notifyLastNameChange(value) self._SO_set_lastName(value) 或者你可能想要包含电话号码的数字,需要限制长度,可以按照如下格式: import re class PhoneNumber(SQLObject): phoneNumber=StringCol(length=30) _garbageCharactersRE=re.compile(r'[/-/./(/) ]') _phoneNumberRE=re.compile(r'^[0-9]+$') def _set_phoneNumber(self,value): value=self._garbageCharactersRE.sub('',value) if not len(value)>=10: raise ValueError( 'Phone numbers must be at least 10 digits long') if not self._phoneNumberRE.match(value): raise ValueError,'Phone numbers can contain only digits' self._SO_set_phoneNumber(value) def _get_phoneNumber(self): value=self._SO_get_phoneNumber() number='(%s) %s-%s'%(value[0:3],value[3:6],value[6:10]) if len(value) > 10: number+=' ext.%s'%value[10:] return number 在修改从属性中获得的数据时必须小心。有些时候,人们希望设置与返回的值相同。这个例子中我们在存入数据库之前去除了一些字符,并在取出的时候重新格式化了。这个方法(反对存取属性)的优点之一是程序员往往希望将这些分开。