我正在用Twisted制作一个IRC机器人,我遇到了一个问题。我想将函数从一个单独的文件导入到我的主类(继承irc.IRCClient的那个类)中,这样它们就可以用作方法。我已经想出了两种可能的解决方案,但它们看起来都有点新,而且都有问题。
解决方案1:将一个类中的函数放在一个单独的文件中,将其导入我的主文件中,并使我的主类继承该类。这种解决方案的问题是,我最终将继承相当多的类,并且每次为机器人创建新模块时,我都必须修改我的主类。
解决方案2:将函数放在单独的文件中,将其导入到我的主文件中,并将每个导入的函数赋给一个变量。这很烦人,因为我必须在我的主类中为我希望该类从其他地方导入的每个方法设置一个变量。
示例:
importthis.py
class a():
def somemethod(self):
print "blah"main.py
import importthis
class mainClass(irc.IRCClient):
thisisnowamethod = importthis.a()正如您所看到的,这两种方法(不是双关语)都需要进行大量愚蠢的维护工作。有没有更聪明的方法来做这件事?
发布于 2011-10-27 23:55:11
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来装饰它们,但我还没有尝试过。)
这是一个很好的“混合”模式,在这种模式下,你不一定想要使用多重继承和可能导致的麻烦。
发布于 2011-10-27 23:53:18
我认为,对于这些导入的方法中的每一个,都需要回答的问题是,它是否作用于对象的状态?答案似乎是否定的--他们不知道您的主类,因此不应该是主类上的方法。我不认为你的主类和它继承的类之间存在IS-A关系。
但是,您的问题是希望调用者能够访问这些方法吗?一个好的解决方案是将这些方法作为一个可以导入的模块来使用。
https://stackoverflow.com/questions/7918495
复制相似问题