我有一种方法可以自动创建包装数据库表的 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)
我刚刚发现,如果我尝试为一个不存在的类成员设置一个值,例如 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))
这假定可以查找的任何属性也可以有效地分配给它。如果您的 property
的 getter 不起作用,除非在 getter 之前调用 setter,否则它可能会中断。它也可能过于宽松,因为它允许设置覆盖类属性的实例属性(例如 __init__
)。另一种方法可能是根据已知属性的白名单检查名称(但一定要包括继承类机制所需的属性,如 DefaultTableName
和 _keyFields
).
关于python - 如何为不存在的类成员引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42028989/