Python class can't find attribute

2019-08-14 12:39发布

问题:

Basically, I want to run the connect function but I keep getting the CMD error message 'class StraussBot has no attribute 'connectSock' but I can obviously see it does. I've tried searching on here and I can't find any resolutions to this issue. SO it will be greatly appreciated if you could help me find why this isn't finding the 'connectSock' function.

Code:

import socket
    from config import HOST, PORT, CHANNEL

# User Info
USER = "straussbot" # The bots username
PASS = "oauth:sj175lp884ji5c9las089sm9vvaklf" # The auth code

class StraussBot:
    def __init__(self):
        self.Ssock = socket.socket()

    def connectSock(self):
        self.Ssock.connect((HOST, PORT))
        self.Ssock.send(str("Pass " + PASS + "\r\n").encode('UTF-8'))
        self.Ssock.send(str("NICK " + USER + "\r\n").encode('UTF-8'))
        self.Ssock.send(str("JOIN " + CHANNEL + "\r\n").encode('UTF-8'))

if __name__ == "__main__":
    print "Starting the bot..."
    while True:
        straussbot = StraussBot
        try:
            straussbot.connectSock()
        except Exception as e:
            print e

回答1:

You are getting confused by the error here. You get an AttributeError for self.Ssock because you do not have an instance.

You only created a reference to the class here:

straussbot = StraussBot

You need to call the class to produce an instance:

straussbot = StraussBot()

You are also mixing tabs and spaces:

Note how lines 5 through 9 have lines in the indentation, but the rest have dots? Those are tabs, and Python sees those as 8 spaces. So your connectSock method is indented inside of __init__ and not seen as a method on StrausBot.

You'll have to stick to either just tabs or just spaces. Python's styleguide strongly recommends you use spaces only.



回答2:

You forgot to instantiate an object of your class StraussBot.

straussbot = StraussBot

just assigns the name straussbot to refer to the class StraussBot. Change that line to

straussbot = StraussBot()

to actually create an instance of your class. You can then call the connectSock method on that instance as expected.



回答3:

You've mixed tabs and spaces. You might think your StraussBot class has a connectSock method, but you actually put the definition of connectSock nested inside the __init__ method.

Turn on "show whitespace" in your editor to see the problem. There's probably a "convert tabs to spaces" option you can use to autofix it. Running Python with the -tt option will make Python notify you when something like this happens.

Also, you'll need to actually create an instance of StraussBot, rather than just setting straussbot to the class itself: straussbot = StraussBot().