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
相关产品推荐
相关产品推荐

