Python跨类传递参数调用sendmail类时出现参数未定义错误
解决"参数未定义"错误的方案
看起来你在类定义和参数传递上踩了几个小坑,我来帮你捋清楚:
问题根源
- 类定义语法错误:你把
argument写在了类的继承位置(class sendmail(argument)),这里应该填父类(比如Python2的object,Python3可以省略),而不是要接收的参数。 - 变量作用域错误:类顶层的代码在类创建时就会执行,此时
argument还没有被传入,自然会提示未定义。你需要把参数传递到类的初始化方法里,再根据参数设置邮件内容。
修正后的完整代码示例
#!/usr/bin/python import smtplib from email.mime.text import MIMEText class SendMail: # Python3默认继承object,不用显式写 def __init__(self, argument): self.to = 'yourmail@gmail.com' self.subject = "" self.text = "" # 根据传入的参数设置邮件内容 self._set_mail_content(argument) def _set_mail_content(self, argument): if argument == 'PIR': self.subject = 'PIR Alert' self.text = 'Motion is detected!' elif argument == 'TEMP': # 可以扩展其他类型 self.subject = 'Temperature Warning' self.text = 'Temperature is out of range!' # 其他邮件类型的判断... def send(self): # 补全发送邮件的逻辑 sender_email = 'your-sender@gmail.com' sender_password = 'your-app-password' # 推荐用谷歌应用专用密码 msg = MIMEText(self.text) msg['Subject'] = self.subject msg['From'] = sender_email msg['To'] = self.to try: with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server: server.login(sender_email, sender_password) server.send_message(msg) print("邮件发送成功") except Exception as e: print(f"发送失败: {str(e)}") # 在其他类中调用示例 class MotionSensor: def __init__(self): self.mailer = SendMail('PIR') # 传入参数'PIR' def trigger_alarm(self): self.mailer.send() # 测试调用 sensor = MotionSensor() sensor.trigger_alarm()
关键修改点说明
- 类初始化方法
__init__:通过__init__接收argument参数,这样每次创建SendMail实例时都能传入不同的参数,保证参数作用域正确。 - 封装邮件内容设置:用私有方法
_set_mail_content根据参数设置主题和内容,代码结构更清晰,也方便后续扩展其他邮件类型。 - 实例变量替代类变量:把
TO、SUBJECT等改成实例变量(self.to、self.subject),避免类变量的全局影响,每个实例可以独立配置。 - 完善发送逻辑:补全了smtplib发送邮件的完整流程,包括MIMEText构造邮件和异常处理,让代码更健壮。
这样修改后,你在其他类中创建SendMail实例时传入对应的参数(比如'PIR'),就能正确触发对应类型的邮件发送,不会再出现“参数未定义”的错误了。
内容的提问来源于stack exchange,提问作者Elfin forest
相关产品推荐
相关产品推荐

