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

标签 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)

我刚刚发现,如果我尝试为一个不存在的类成员设置一个值,例如 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/

相关文章:

python - 机器学习中如何处理缺失数据?

python - 使用 Python 2.7 在包含 .py 的文件夹的子文件夹中调用应用程序

python - 如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘

python - 在 Django CBV 中从纯 HTML 表单访问 POST 数据

c++ - 多个文件中的多个类 - C++/Arduino

css - 根据其他类的元素样式与 LESS

python - 使用 Pandas 重采样时如何获取字符串变量的模式

swift - 在 Swift 中创建一个继承自 SKSpriteNode 数组的类

c# - 类属性,在内部可获取和可设置,但只能在外部获取

c++ - 初学者 C++ 程序员,对动态数组感到困惑