我有一个奇怪的问题,我正在写一个支持插件扩展的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
你可以取代的代码,例如用与此问题相关的代码激活与此问题无关的问题。你没有发布的setter和getters(仅适用于一个属性就足够了)将是一个好的开始。目前,我不知道这些属性如何设置。另外,你的3.x,对不对? – aaronasterling 2010-10-31 04:18:19
你不需要Python的getter或setter。我有SetName()的唯一原因是因为我不希望人们用空格来设置名称。是的,3.x – Blazer 2010-10-31 04:27:22
@Blazer,我的坏。我发誓我看到他们都通过二传手分配,但我显然是错的。 – aaronasterling 2010-10-31 04:33:51