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

Python包中子类无法实例化及方法调用问题求助

Python包调用问题修复与优化方案

一、核心错误梳理

你的代码里存在几个直接导致问题的错误:

  • 模块实例化错误:消费代码里api = rest()是把模块当成类来实例化,模块根本不能这么用,应该直接调用模块里的类。
  • 子类语法错误:Get、Put类没写__init__方法,直接写super().__init__会触发语法报错,初始化逻辑必须放在__init__方法内部。
  • 基类参数不匹配:Root的__init__没有参数,但子类调用时传了whatever1, whatever2,会导致参数不匹配错误。

二、分步修复

1. 修正module.py的语法与逻辑

把类定义和初始化逻辑改对:

class Root:
    def __init__(self):
        self.attrib1 = "whatever1"  # 替换成你的实际值
        self.attrib2 = "whatever2"  # 替换成你的实际值

class Get(Root):
    def __init__(self):
        super().__init__()  # 基类__init__无参数,不用传值
        self.headers = {"header1": "your-get-header"}  # 实际GET请求头

    def get(self):
        # 这里写你的业务逻辑,可直接用self.headers、self.attrib1/attrib2
        print(f"执行GET请求:请求头{self.headers},attrib1={self.attrib1}")

class Put(Root):
    def __init__(self):
        super().__init__()
        self.headers = {"header2": "your-put-header"}  # 实际PUT请求头

    def put(self):
        # 这里写你的业务逻辑
        print(f"执行PUT请求:请求头{self.headers},attrib2={self.attrib2}")

2. 优化__init__.py(可选)

如果想让用户不用导入模块,直接从包导入类,修改my_pkg/__init__.py:

from .module import Root, Get, Put

3. 修正消费代码

方式一:通过模块调用类

from my_pkg import module as rest
# 直接用模块里的类,别实例化模块
get_client = rest.Get()
get_client.get()  # 正常调用GET方法

put_client = rest.Put()
put_client.put()  # 正常调用PUT方法

方式二:直接从包导入类(对应上面的__init__.py调整)

from my_pkg import Get, Put
get_client = Get()
get_client.get()

put_client = Put()
put_client.put()

三、实现"单对象调用所有请求方法"的需求

如果不想分别实例化Get、Put,希望一个对象就能调用所有请求方法,给你两种方案:

方案一:聚合子类实例到Root类

修改module.py,让Root类作为统一入口,内部包含各请求子类的实例:

class Root:
    def __init__(self):
        self.attrib1 = "whatever1"
        self.attrib2 = "whatever2"
        # 初始化各请求处理器
        self._get_handler = Get()
        self._put_handler = Put()

    def get(self, *args, **kwargs):
        # 转发到Get类的get方法
        return self._get_handler.get(*args, **kwargs)
    
    def put(self, *args, **kwargs):
        # 转发到Put类的put方法
        return self._put_handler.put(*args, **kwargs)

class Get(Root):
    def __init__(self):
        super().__init__()
        self.headers = {"header1": "your-get-header"}

    def get(self):
        print(f"执行GET请求:请求头{self.headers},attrib1={self.attrib1}")

class Put(Root):
    def __init__(self):
        super().__init__()
        self.headers = {"header2": "your-put-header"}

    def put(self):
        print(f"执行PUT请求:请求头{self.headers},attrib2={self.attrib2}")

消费代码用起来更简单:

from my_pkg import Root
api = Root()
api.get()  # 直接调用GET方法
api.put()  # 直接调用PUT方法

方案二:直接在Root类集成所有请求逻辑

如果子类只是用来设置不同请求头,完全可以不用子类,直接在Root类里定义各请求方法,内部切换请求头:

class Root:
    def __init__(self):
        self.attrib1 = "whatever1"
        self.attrib2 = "whatever2"
        # 定义各请求的专属头
        self.get_headers = {"header1": "your-get-header"}
        self.put_headers = {"header2": "your-put-header"}

    def get(self):
        print(f"执行GET请求:请求头{self.get_headers},attrib1={self.attrib1}")

    def put(self):
        print(f"执行PUT请求:请求头{self.put_headers},attrib2={self.attrib2}")

消费代码同样简洁:

from my_pkg import Root
api = Root()
api.get()
api.put()

内容的提问来源于stack exchange,提问作者Gus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:25:23