我有一种方法可以自动创建包装数据库表的 Python 类,类成员与表中的字段同名。类文件如下所示:
class CpsaUpldBuildChrgResultSet(Recordset):
def __init__(self, connection):
super().__init__(connection)
self.DefaultTableName = 'cpsa_upld_build_chrg_result'
self._keyFields.append('j_trans_seq')
self._keyFields.append('j_index')
@property
def j_trans_seq(self):
return self.GetValue('j_trans_seq')
@j_trans_seq.setter
def j_trans_seq(self, value):
self.SetKeyValue('j_trans_seq', value)
@property
def j_index(self):
return self.GetValue('j_index')
@j_index.setter
def j_index(self, value):
self.SetKeyValue('j_index', value)
Run Code Online (Sandbox Code Playgroud)
我刚刚发现,如果我尝试为不存在的类成员(例如 J_TRANS_SEQ)设置值,则不会引发异常。有什么我可以添加到这个类中的,以便尝试访问不存在的成员会引发异常?
您可以__setattr__向您的类添加一个方法,该方法在AttributeError分配给无效属性时引发。我不确定您究竟想如何确定哪些属性有效,哪些无效,但一种方法可能是这样的:
def __setattr__(self, name, value):
if hasattr(self, name):
super().setattr(name, value)
else:
raise AttributeError("{} object has no attribute {!r}".format(type(self), name))
Run Code Online (Sandbox Code Playgroud)
这假定可以查找的任何属性也可以分配给有效。如果您property的 getter 不起作用,除非在 getter 之前调用 setter,否则它可能会中断。它也可能过于宽松,因为它允许设置覆盖类属性(例如__init__)的实例属性。另一种方法可能是根据已知属性的白名单检查名称(但一定要包括继承类机制所需的属性,例如DefaultTableName和_keyFields)。