Python:为什么我使用super()而不是使用显式超类名称来获取异常?

ROB*_*SON 1 python super

当我尝试使用基本类的属性访问时,我得到一个异常super(),但是当我明确使用基类名时.这是派生类:

from CPSA_TransactionLogOutSet import CPSA_TransactionLogOutSet

class CPSA_TransactionFailureSet(CPSA_TransactionLogOutSet):
    def __init__(self, connection, failedTransactionKey):
        super().__init__(connection)
        CPSA_TransactionLogOutSet.C_TRANS_TYP = "TRANS_FAIL"
        super().C_TRANS_TYP = "TRANS_FAIL"
        super().DefaultTableName = 'CPSA_TRANSACTION_LOG_IN'
        super()._keyFields.append('J_TRANS_SEQ')
Run Code Online (Sandbox Code Playgroud)

但尝试创建实例会引发AttributeError异常:

AttributeError: 'super' object has no attribute 'C_TRANS_TYP'
Run Code Online (Sandbox Code Playgroud)

基类由一个__init__()方法和一组属性组成,这里只显示其中一个:

class CPSA_TransactionLogOutSet(Recordset):
    def __init__(self, connection):
        super().__init__(connection)
        self.DefaultTableName = 'CPSA_TRANSACTION_LOG_OUT'

    @property
    def C_TRANS_TYP(self):
        return self.GetValue('C_TRANS_TYP')
    @C_TRANS_TYP.setter
    def C_TRANS_TYP(self, value):
        self.SetValue('C_TRANS_TYP', value)
Run Code Online (Sandbox Code Playgroud)

为什么我不能super()用来访问该C_TRANS_TYP物业?

Mar*_*ers 5

您根本不需要使用super() ,因为当前类没有覆盖.描述符将被绑定到self没有super().这同样适用于其他属性self:

def __init__(self, connection, failedTransactionKey):
    super().__init__(connection)
    self.C_TRANS_TYP = "TRANS_FAIL"
    self.DefaultTableName = 'CPSA_TRANSACTION_LOG_IN'
    self._keyFields.append('J_TRANS_SEQ')
Run Code Online (Sandbox Code Playgroud)

super()仅需要访问通过其他方式无法访问的描述符self.在正常(通过实例)访问路径就足够了这里.

super()不能用于绑定赋值或del obj.attr语句中的数据描述符,因为super()对象不实现__set____delete__.换句话说,使用super().attribute作品只读取属性,永远不会写入或删除.

设置CPSA_TransactionLogOutSet.C_TRANS_TYP也不正确; 这取代了描述对象的类.通过执行该行,您完全从类层次结构中删除了描述符,因此既self.C_TRANS_TYP不会也super().C_TRANS_TYP不会触发property您之前定义的.