【问题标题】:Importing methods from file into a class将文件中的方法导入类
【发布时间】:2011-12-16 15:18:52
【问题描述】:

我正在使用 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()

如您所见,这两种方法(不是双关语)都需要大量愚蠢的工作来维护。有没有更聪明的方法来做到这一点?

【问题讨论】:

    标签: python oop function twisted irc


    【解决方案1】:
    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 来装饰它们,但我还没有尝试过。)

    这是一个很好的“混合”模式,您不一定想使用多重继承和可能导致的麻烦。

    【讨论】:

    • 这正是我想要的!非常感谢。
    • from blah import * 似乎完全可以工作,但是当我运行它时它显示“SyntaxWarning: import * only allowed at module level”。这是我应该担心的事情吗?
    • 没有意识到它会这样做(仅测试了import a, b, c 表单)。这是一个警告,所以你可以忽略它,但如果它有效,我想这意味着它可能会在以后的 Python 版本中发生变化。无论如何,最好明确列出您想要的符号。
    • 好的。这是一些额外的工作,但如果这样做更好,我想我会这样做。 :)
    • 这样做的好处是您可以查看类定义并查​​看类中的实际内容。而如果你只是import * 那么你必须去看看另一个模块。此外,如果你向另一个模块添加一些东西,它可能会破坏你已经在类中定义的东西。
    【解决方案2】:

    我认为每个导入的方法需要回答的问题是,它是否作用于对象的状态?答案似乎是否定的——他们不知道你的主类,因此不应该是主类上的方法。而且我认为您的主类与其继承的主类之间没有 IS-A 关系。

    但是您是否希望调用者能够访问这些方法?一个好的解决方案是将这些方法作为可导入的模块提供。

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多