2010-10-31 91 views
0

我有一个奇怪的问题,我正在写一个支持插件扩展的chatbot。基本扩展类具有预定义的属性和方法,这些属性和方法将被继承,并且可以被重载和设置。这是基础类:python类的属性没有设置?

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) 

这是一个扩展通常是这样的:

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 

每个分机这样写的作品...除了一个,上面提到的一个。只有在设置Name属性时才能成功,并且读取其他属性时,它们仍然是基类的设置。在启动时,我通过各种扩展循环打印的字典项,实际的名称,版本,作者,和扩展是打开还是没有,得到了这样的结果:

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 

同样,Extension.Activate( )在打开AI时不适用于AI。我认为有同样的问题也做(没有正确设置)

任何想法,为什么类的属性没有设置?我一直停留在这几个小时,扩展设置完全相同的方式与其他附加的

编辑:这里是另一个分机进行比较。这个实际工作,Activate()实际上是调用。一切都非常准确地大于内容相同的其他

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 
+1

你可以取代的代码,例如用与此问题相关的代码激活与此问题无关的问题。你没有发布的setter和getters(仅适用于一个属性就足够了)将是一个好的开始。目前,我不知道这些属性如何设置。另外,你的3.x,对不对? – aaronasterling 2010-10-31 04:18:19

+0

你不需要Python的getter或setter。我有SetName()的唯一原因是因为我不希望人们用空格来设置名称。是的,3.x – Blazer 2010-10-31 04:27:22

+0

@Blazer,我的坏。我发誓我看到他们都通过二传手分配,但我显然是错的。 – aaronasterling 2010-10-31 04:33:51

回答

0

我解决我自己的问题。匝我有一个扩展覆盖AI,所以它不是AI扩展本身。非常感谢帮助,虽然,伙计们。一个起来为大家

1

是否有可能在SETNAME调用下面的模块实际上是缩进的不同(比如,用制表符代替空格)和以下线的__init__实际上不是一部分?

+0

不,只有缩进空间 – Blazer 2010-10-31 03:55:40

1

我不认为这是你的问题,因为你得到你想要与其他类的东西 - 但我希望你能看到你没有设置任何“类”继承类的属性 - 要设置只是实例属性为他们。 (因此,如果您尝试获取Extension.Version - 它将从基类“Ext”中选择属性 - 只有当您拥有扩展对象时,它的版本属性才会被实例属性“版本”覆盖。

这不包括为什么“激活”不会,虽然工作

+0

这些类在加载时被实例化。 Activate()不工作,因为它正在运行原始的Activate(),这只是一个'通' – Blazer 2010-10-31 04:55:31

2

你忘了在类扩展一个“自我”。

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

也,也许您的打印测试是不准确的,你是否尝试过的单元测试?

+0

,应该不相关。 self.AI仅仅是扩展数据的存储空间(存储聊天室是否具有AI)。如果文件不存在,则关闭所有聊天室。虽然现在修好了,我错过了那个错字。 – Blazer 2010-10-31 11:48:04