python class attributes not setting?
Question: I am having a weird problem with a chatbot I am writing that supports plugin
extensions. The base extension class have attributes and methods predefined
that will be inherited and can be overloaded and set. Here is the base class:

    
    
    class Ext:
        # Info about the extension
        Name    = 'Unnamed'
        Author  = 'Nobody'
        Version = 0
        Desc    = 'This extension has no description'
        Webpage = ''
    
        # Determines whether the extension will automatically be on when added or not
        OnByDefault = False
    
        def __init__(self): 
            # Overwrite me! You can use me to load files and set attributes at startup
            raise Exception('AbstractClassError: This class must be overloaded')
    
        def SetName(self, name):
            name = name.split(' ')
            name = ''.join(name)
            self.Name = name
    
        def Load(self, file): 
            # Loads a file
            return Misc.read_obj(file)
    
        def Save(self, file, obj): 
            # Saves a file
            return Misc.write_obj(file, obj)
    
        def Activate(self, Komodo):
            # When the extension is turned on, this is called
            pass
    
        def add_cmd(self, Komodo, name, callback, default=False, link=''):
            # Add a command to the bot
            if name in Komodo.Ext.commands:
                Komodo.logger(msg = ">> Command '{0}' was already defined, so {1}'s version of the command couldn't be added".format(
                    name, self.meta.name))
            else:
                Komodo.Ext.commands[name] = callback
                if default:
                    Komodo.Ext.default_commands.append(name)
                if len(link) > 0:
                    Komodo.Ext.links[name] = link
    
        def add_event(self, Komodo, type, callback):
            # Add an event to the bot
            if type not in Komodo.Ext.trigs:
                Komodo.logger(msg = 
                    ">> Could not add '{0}' to event type '{1}' from extension '{2}' because that type does not exist".format(
                    str(callback), type, self.name))
            else:
                Komodo.Ext.trigs[type].append(callback)
    

This is what an extension normally looks like:

    
    
    class Extension(Ext):
        def __init__(self, K):  
            self.file = 'Storage/Extensions/AI.txt'
            self.SetName('AI')
    
            self.Version = 1.1
            self.Author  = 'blazer-flamewing'
            self.Desc    = 'An extension that lets you talk to an Artificial Intelligence program online called Kato.'
            self.Webpage = 'http://botdom.com/wiki/Komodo/Extensions/AI'
    
            try:    self.AI = self.Load(file)
            except: self.AI = {}
    
        def Activate(self, K):
            print(self.Version)
            self.add_cmd(K, 'ai', self.cmd_AI, False, 'http://botdom.com/wiki/Komodo/Extensions/AI')
            self.add_event(K, 'msg', self.msg_AI)
    
    
        ...more methods down here that aren't part of the base class
    

Every extension written like this works... except for one, the one mentioned
above. It only succeeds when setting it's Name attribute, and when the other
attributes are read they are still what the base class was set. At startup, I
looped through every extension to print the dict entry, the actual name, the
version, the author, and whether the extension was on or not and got this
result:

    
    
    Responses Responses 1.2 blazer-flamewing OFF
    Ai AI 0 Nobody ON
    Notes Notes 1.2 blazer-flamewing OFF
    Misc Misc 1.5 blazer-flamewing OFF
    System System 2.2 blazer-flamewing ON
    Helloworld HelloWorld 1.3 blazer-flamewing OFF
    Goodbyes Goodbyes 0 blazer-flamewing OFF
    Spamfilter Spamfilter 1.2 blazer-flamewing OFF
    Damn dAmn 2.2 blazer-flamewing ON
    Bds BDS 0.2 blazer-flamewing OFF
    Fun Fun 1.6 blazer-flamewing OFF
    Welcomes Welcomes 1.5 blazer-flamewing OFF
    Cursefilter Cursefilter 1.7 blazer-flamewing OFF
    

Similarly, Extension.Activate() isn't working for AI when it is turned on. I
assume that has to do with the same sort of problem (not being set properly)

Any ideas as to why the class's attributes aren't setting? I've been stuck on
this for hours and the extension is set up the exact same way other extensions
are

EDIT: Here is another extension for comparison. This one actually works,
Activate() actually calls. everything is pretty much exactly the same other
than content

    
    
    from komodo.extension import Ext
    import time
    
    class Extension(Ext):        
        def __init__(self, K):
            self.SetName('dAmn')
            self.Version = 2.2
            self.Author  = 'blazer-flamewing'
            self.Desc    = 'Module for all standard dAmn commands such as join, part, and say.'
            self.Webpage = 'http://botdom.com/wiki/Komodo/Extensions/dAmn'
            self.OnByDefault = True
    
        def Activate(self, K):
            self.add_cmd(K, 'action',       self.cmd_action,       False, "http://botdom.com/wiki/Komodo/Extensions/dAmn#Me_or_Action")
            self.add_cmd(K, 'ban',          self.cmd_ban,          False, "http://botdom.com/wiki/Komodo/Extensions/dAmn#Ban_and_Unban")
            self.add_cmd(K, 'chat',         self.cmd_chat,         True,  "http://botdom.com/wiki/Komodo/Extensions/dAmn#Chat")
            self.add_cmd(K, 'demote',       self.cmd_demote,       False, "http://botdom.com/wiki/Komodo/Extensions/dAmn#Demote_and_Promote")
            self.add_cmd(K, 'join',         self.cmd_join,         False, "http://botdom.com/wiki/Komodo/Extensions/dAmn#Join_and_Part")
            ...etc
    


Answer: You forgot a 'self' in class Extension:

    
    
    try:    self.AI = self.Load(self.file)
    

also, maybe your printing test is inaccurate. Have you tried unit tests?

