Python类初始化报错TypeError: __init__() missing 1 required positional argument: 'lists'的原因解析
首先咱们把报错的核心逻辑讲透:你最初定义的child类,它的构造方法__init__要求必须传入一个lists参数,但你用obj=child()创建实例时完全没传这个参数,所以Python直接抛出了「必填参数缺失」的错误。
接下来拆解背后的细节:
当你用
类名()创建实例时,Python会自动调用类里的__init__方法来初始化这个实例。这个方法里除了第一个固定的self(代表实例本身),其他定义的参数都是实例化时必须传入的必填参数。
比如你最开始的类代码:import numpy as np # 别忘了导入numpy,否则np会报错 class child: def __init__(self,lists): self.myList = lists def find_mean(self): mean=np.mean(self.myList) return mean这里
__init__明确要求传入lists,所以必须像obj=child([44,22,55])这样传值,Python才能把这个列表绑定到实例的self.myList属性上,后续find_mean方法才能直接用这个属性计算均值。你后来修改的类去掉了自定义的
__init__方法,把列表参数移到了find_mean里:class child: def find_mean(self,myList): mean=np.mean(myList) return mean这时候Python会使用默认的无参数构造方法,所以
obj=child()能正常创建实例——但这种方式下,每次调用find_mean都得手动传列表,和你最初想把列表绑定到实例、后续不用重复传值的逻辑完全不同。
如果你想保留最初的类定义逻辑(把列表绑定到实例),同时又希望实例化时可以选传参数(比如不传就用默认值),可以给__init__的lists参数加默认值,同时注意避免可变对象当默认参数的坑:
import numpy as np class child: def __init__(self, lists=None): # 如果没传参数,就把myList设为空列表 self.myList = lists if lists is not None else [] def find_mean(self): # 处理空列表的情况,避免计算均值时报错 if not self.myList: return 0 # 或者根据需求抛出提示信息 mean = np.mean(self.myList) return mean
这样你既可以用obj=child([44,22,55])传列表创建实例,也可以用obj=child()创建带空列表的实例,后续调用find_mean都能正常运行。
内容的提问来源于stack exchange,提问作者Sameer Verma

