Python多层及多重继承场景下无法访问AWSClient类方法问题咨询
Python多层继承类方法访问问题解答
问题1:InviteAdminsModel的实现是否正确?
不正确,存在多个明显问题:
- 笔误:DynamoTable类的
__init__方法中调用父类构造时写的是AWSClients.__init__(self),但父类实际类名是AWSClient,多了一个s,会直接抛出类不存在的错误 - 多余的多重继承:BaseModel已经通过DynamoTable继承了AWSClient,InviteAdminsModel不需要再额外继承AWSClient,重复继承会打乱方法解析顺序(MRO)
- 语法错误:InviteAdminsModel的类注释、
__init__方法都没有正确缩进,属于Python语法错误 - super用法错误:
super(BaseModel, self)的含义是从BaseModel的父类开始查找方法,而get_admin_table是DynamoTable类的方法,这里不需要也不应该给super传BaseModel参数
问题2:如何才能正常调用AWSClient的类方法?
修正所有基础错误后,因为你的继承链已经包含AWSClient,直接通过实例调用即可,不需要用super,操作步骤如下:
- 先修正DynamoTable的构造方法调用:
class DynamoTable(AWSClient): def __init__(self): # 修正类名笔误,用super写法更易维护 super().__init__()
- 去掉InviteAdminsModel多余的AWSClient继承,修正缩进和super用法:
class InviteAdminsModel(BaseModel): """ This is a sample model for Admins table. This must be in the helper module of each API. All the API specific interation with dynamo should be written in the methods of this class. """ def __init__(self): super().__init__() self.admin_table = self.get_admin_table() # 直接调用继承来的AWSClient方法即可 self.ses_client = self.get_ses_client()
如果一定要用super调用,直接写super().get_ses_client()即可,不需要额外传参数。
问题3:BaseModel是否应该设置为抽象类?
根据业务场景决定即可:
- 如果BaseModel本身不需要被实例化,且要求所有继承它的子类必须实现某些固定接口(比如统一的
save、delete方法),那就可以用Python的abc模块将其设为抽象基类,避免上层开发者错误实例化BaseModel,也能强制规范子类的实现 - 如果BaseModel只提供通用公共方法,没有强制要求子类实现的接口,也允许直接实例化使用,那就不需要设为抽象类。
内容的提问来源于stack exchange,提问作者Jeet Patel
相关产品推荐
相关产品推荐

