Python类方法设置默认参数调用时报无fps属性错误如何解决
问题产生原因
方法定义中def screen(self,fps=12.0,time=10)里的fps和time是screen方法的局部形参,不属于实例属性。你在方法内部通过self.fps、self.time调用时,Python会去VidRec类的实例属性列表中查找对应值,但你从未将传入的参数绑定到实例上,因此触发「实例不存在fps属性」的报错。
修复方案
你的代码中fps和time仅在screen方法内部使用,不需要绑定为实例属性,直接调用形参即可,同时可以顺手修正原代码中颜色通道转换顺序写反的问题(否则输出视频会出现颜色异常):
- 将方法内所有
self.fps替换为形参fps,self.time替换为形参time - 将颜色转换逻辑从
cv2.COLOR_BGR2RGB改为cv2.COLOR_RGB2BGR:pyautogui截图输出的是RGB顺序图像,OpenCV的VideoWriter写入需要BGR顺序输入
修复后的完整类代码如下:
import pyautogui import cv2 import numpy as np class VidRec: def screen(self,fps=12.0,time=10): SCREEN_SIZE = tuple(pyautogui.size()) fourcc = cv2.VideoWriter_fourcc(*"XVID") out = cv2.VideoWriter("output.avi", fourcc, fps, SCREEN_SIZE) for i in range(int(time * fps)): img = pyautogui.screenshot() # 转换为OpenCV可处理的numpy数组 frame = np.array(img) # 修正颜色空间转换顺序,适配OpenCV写入要求 frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) out.write(frame) # 按q键可提前终止录制 if cv2.waitKey(1) == ord("q"): break cv2.destroyAllWindows() out.release()
原有调用逻辑不需要修改,直接无参调用p.screen()就会按照默认的12帧率、录制10秒的参数运行。
如果你后续需要在VidRec类的其他方法中访问fps、time参数,可以在screen方法开头增加两行代码,将形参绑定为实例属性:
self.fps = fps self.time = time
绑定后再使用self.fps、self.time就不会触发属性不存在的报错。
内容的提问来源于stack exchange,提问作者tavgar elahmed
相关产品推荐
相关产品推荐

