如何为不存在的类成员引发异常?

ROB*_*SON 3 python class

我有一种方法可以自动创建包装数据库表的 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)设置值,则不会引发异常。有什么我可以添加到这个类中的,以便尝试访问不存在的成员会引发异常?

Blc*_*ght 5

您可以__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)。