我正在制作一个使用Twisted的IRC机器人,但我遇到了一个问题。我想将函数从单独的文件导入到我的主类(继承irc.IRCClient的类)中,因此它们可以用作方法。我想到了两种可能的解决方案,但它们看起来都有些新意,而且它们都有问题。
解决方案1:将函数放在一个单独的文件中,将其导入到我的主文件中,然后让我的主类继承该类。这个解决方案的问题是我最终会继承很多类,每次为bot创建一个新模块时我都要修改我的主类。
解决方案2:将函数放在单独的文件中,将其导入到我的主文件中,并将每个导入的函数分配给变量。这很烦人,因为我必须在我的主类中为我希望该类从其他地方导入的每个方法设置一个变量。
importthis.py
class a():
def somemethod(self):
print "blah"
main.py
import importthis
class mainClass(irc.IRCClient):
thisisnowamethod = importthis.a()
正如你所看到的,这两种方法(没有双关语)需要很多愚蠢的工作来维护。有更聪明的方法吗?
答案 0 :(得分:2)
class mainClass(irc.IRCClient):
from othermodule import a, b, c
# othermodule.a, b, and c are now methods of mainClass
from anothermodule import *
# everything in anothermodule is now in mainClass
# if there are name conflicts, last import wins!
这是有效的,因为import
只是将符号导入命名空间,并不关心它是什么类型的命名空间。模块,类,功能 - 它都是import
的共同主体。
当然,必须编写othermodule
中的函数来接受self
作为它们的第一个参数,因为它们将成为mainClass
个实例的实例方法。 (您可以使用@classmethod或@staticmethod来装饰它们,但我没有尝试过。)
对于“mix-ins”来说,这是一个很好的模式,你不一定要使用多重继承和可能导致的麻烦。
答案 1 :(得分:1)
我认为每个导入方法需要回答的问题是,它是否作用于对象的状态?答案似乎是否定的 - 他们不了解你的主类,因此不应该是主类的方法。而且我认为你的主类与它继承的主类之间存在IS-A关系。
但是您希望调用者能够访问这些方法吗?一个好的解决方案就是将这些方法作为可以导入的模块使用。