You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在父类的@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:13:01