You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python跨类传递参数调用sendmail类时出现参数未定义错误

解决"参数未定义"错误的方案

看起来你在类定义和参数传递上踩了几个小坑,我来帮你捋清楚:

问题根源

  1. 类定义语法错误:你把argument写在了类的继承位置(class sendmail(argument)),这里应该填父类(比如Python2的object,Python3可以省略),而不是要接收的参数。
  2. 变量作用域错误:类顶层的代码在类创建时就会执行,此时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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:03:04