如何在父类的@classmethod中引用子类?附数据库对象创建代码
父类类方法中引用子类的解决方案
嘿,这问题我熟!你现在的核心需求是让父类的get方法能自动适配调用它的子类,不用在每个子类里重复写相似的get逻辑对吧?其实把父类的staticmethod改成classmethod就能轻松解决,因为类方法会自动接收当前调用它的子类作为cls参数,直接上代码和解释:
修正后的完整代码
def get_from_db(table, **kwargs): # 模拟数据库查询,返回查询到的字典数据 # 实际这里替换成你的真实数据库查询逻辑 return {"id": 1, "name": "test_data", **kwargs} class Parent: @classmethod def get(cls, **kwargs): """通过类方法自动获取子类对应的表,查询数据库并实例化子类对象""" # 这里的cls就是调用该方法的子类(比如ChildA),直接用它的_table属性 db_data = get_from_db(cls._table, **kwargs) # 用cls实例化,自动创建对应的子类对象 return cls(**db_data) class ChildA(Parent): _table = 'table_child_a' def __init__(self, **kwargs): # 修正原来的拼写错误:setattribute → setattr,attributes → kwargs for k, v in kwargs.items(): setattr(self, k, v) # 测试调用 child_a_instance = ChildA.get(name="test") print(child_a_instance.name) # 输出 test print(type(child_a_instance)) # 输出 <class '__main__.ChildA'>
关键改动说明
- 把父类的
@staticmethod改成@classmethod:类方法的第一个参数cls会自动绑定到调用该方法的子类(比如你调用ChildA.get()时,cls就是ChildA类),这样就能直接访问子类的_table属性。 - 用
cls(**db_data)实例化对象:不再需要在每个子类里重写get方法,父类的get会自动创建对应的子类实例,复用性拉满。 - 修正子类
__init__的错误:原来的attributes应该是传入的kwargs,setattribute是拼写错误,正确的是setattr。
额外提示
如果有多个子类,只要每个子类都定义自己的_table属性,都可以直接复用父类的get方法,完全不用重复写查询和实例化逻辑,非常方便!
内容的提问来源于stack exchange,提问作者llulai
相关产品推荐
相关产品推荐

