Python继承报错:缺少必需位置参数'self'问题求助
排查Python继承中「missing 1 required positional argument: 'self'」报错
先把你提供的代码贴出来方便分析:
model.py 代码
from priceChecker.priceChecker import db class Model(): def __init__(self, tableName): self.__tablename__ = tableName def getAll(self): #, conditions=[] try: print('Executing query for table: ' + self.__tablename__) result = db.execute("SELECT * FROM " + self.__tablename__) return result except ValueError: print("Oops, something went wrong sucker!...")
item.py 代码
from priceChecker.core.models.model import Model class Item(Model): def __init__(self): print... # 你的代码没写完,但能看出重写了__init__方法
可能的报错原因及解决方法
原因1:直接用类调用了实例方法
这是触发这个报错最常见的原因。如果你的代码里是这么调用getAll的:
Item.getAll()
getAll是实例方法,必须通过类的实例来调用——Python会自动把实例对象作为self参数传入方法。直接用类调用的话,没有实例可以传,就会报self缺失的错误。
解决方法:先创建实例再调用方法
先初始化Item的实例,再通过实例调用getAll:
# 先创建Item实例(这里还要解决子类__init__的问题,看下面) item_obj = Item() # 通过实例调用方法 item_obj.getAll()
原因2:子类重写__init__时没调用父类的构造方法
你的Model类要求初始化时必须传入tableName来设置self.__tablename__,但Item类重写了__init__却没有调用父类的__init__方法。这会导致两个问题:
Item实例里没有__tablename__属性,调用getAll时会触发新的报错;- 父类的构造逻辑没执行,实例初始化不完整,也可能间接引发参数相关问题。
解决方法:在子类__init__中调用父类构造
修改Item类的代码,用super()调用父类的__init__并传入对应的表名:
from priceChecker.core.models.model import Model class Item(Model): def __init__(self): # 调用父类的构造方法,传入Item对应的数据库表名,比如"items" super().__init__(tableName="items") # 这里可以写Item自己的初始化逻辑,比如你没写完的print语句 print("Item instance initialized")
如果需要让外部灵活指定表名,也可以改成:
class Item(Model): def __init__(self, table_name="items"): super().__init__(tableName=table_name) # 自定义初始化逻辑
总结
先检查你是不是直接用Item.getAll()这种方式调用方法,如果是,改成实例调用;然后确保Item的__init__正确调用了父类的构造方法,传入必要的tableName参数。这两步改完,这个报错应该就能解决了。
内容的提问来源于stack exchange,提问作者MrCujo
相关产品推荐
相关产品推荐

