缺少1个必需的位置参数:'self'

3

这是我的代码:

class Email_Stuff():
    def __init__(self):
        self.emailaddr = None
        self.recipaddr = None
        self.EmailUser = None
        self.EmailPass = None
    def From_Email(self):
        self.emailaddr = turtle.textinput("Your Email", "What is your email address?")
    def To_Email(self):
        self.recipaddr = turtle.textinput("Client Email", "What is your client's email address?")
    def Email_Username(self):
        self.EmailUser = turtle.textinput("Your Email Username", "What is your email username?")
    def Email_Password(self):
        self.EmailPass = turtle.textinput("Your Email Password", "What is your email Password?")
    def Send_Email(self):
        print (self.emailaddr) #these are here for me to see if it is the right input
        print(self.recipaddr)
        print(self.EmailUser)
        print(self.EmailPass)
        import smtplib
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.login((self.EmailUser),(self.EmailPass))
        self.message = "Python Test Email"
        server.sendmail(self.emailaddr,self.recipaddr,self.message)

我有一个按钮连接到Email_Stuff.From_Email,另一个按钮连接到Email_Stuff.To_Email等等...

每当我按下打开海龟窗口的按钮时,它会给我这个错误:

Exception in Tkinter callback
Traceback (most recent call last):
Fileline "/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/tkinter/__init__.py", 1475, in __call__
return self.func(*args)
TypeError: From_Email() missing 1 required positional argument: 'self'

但是,如果我从“发件人邮箱”和“收件人邮箱”中删除自己,会怎样呢?

class Email_Stuff():
    def __init__(self):
        self.emailaddr = None
        self.recipaddr = None
        self.EmailUser = None
        self.EmailPass = None
    def From_Email():
        self.emailaddr = turtle.textinput("Your Email", "What is your email address?")
    def To_Email():
        self.recipaddr = turtle.textinput("Client Email", "What is your client's email address?")
    def Email_Username():
        self.EmailUser = turtle.textinput("Your Email Username", "What is your email username?")
    def Email_Password():
        self.EmailPass = turtle.textinput("Your Email Password", "What is your email Password?")
    def Send_Email(self):
        print (self.emailaddr) #these are here for me to see if it is the right input
        print(self.recipaddr)
        print(self.EmailUser)
        print(self.EmailPass)
        import smtplib
        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.login((self.EmailUser),(self.EmailPass))
        self.message = "Python Test Email"
        server.sendmail(self.emailaddr,self.recipaddr,self.message)

我收到了这个错误信息(并非全部内容):
    self.emailaddr = turtle.textinput("Your Email", "What is your email address?")
    NameError: global name 'self' is not defined

这是按钮代码:

Email_Button = Button(root, text='Enter Your Email', command=Email_Stuff.From_Email)
Email_Button.pack()
Email_Button.place(x=250,y=210)

很抱歉这篇文章有点长


1
你应该展示相关代码在你所给出的第一个错误所引起的按钮中。 - SimonT
1
SimonT说得非常正确。有些人可能已经猜到了你的问题,但是在未来,你应该实际展示运行引发异常的代码。 - DanielSank
3个回答

15

我认为你遇到了以下问题。如果你使用下面这个类 F

class F():
     def foo(self):
         return 1

尝试调用 F.foo(),您应该会收到类似于您所见到的错误。

>>> F.foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method foo() must be called with F instance as first argument (got nothing instead)

你需要做的就是在 F 对象上调用 foo() 方法。
>>> f=F()
>>> f.foo()
1

我有一个按钮连接到Email_Stuff.From_Email和一个按钮连接到Email_Stuff.From_Email等等...
你可能需要实例化一个Email_Stuff对象,然后调用yourobject.From_Email()。(如果您的类Email_Stuff也包含GUI按钮处理程序的内容,您可以从按钮处理程序中直接调用self.From_Email())

3
错误信息的差异是由于原帖使用了Python 3,其中F.foo返回一个普通函数。 - Martijn Pieters
你也可以使用 F().foo() 运行程序。这是因为在 Python 中,即使你没有在括号中提供任何参数,函数也需要 ()。 - stidmatt

3

在调用方法之前,您是否创建了Email_Stuff实例?因为self是调用该方法的当前对象,所以需要。

class A():
    def __init__(self, attr):
        self.attr = attr
    def func(self):
        print(self.attr)

a = A(42)
a.func() # print 42
# or
A(32).func() # print 32

0

你也可以在函数中避免写"self",例如:

>>> class F():
        def foo():
            return 1

>>> F.foo()

..: 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接