必须使用X实例作为第一个参数调用unbound方法(改为使用X实例)

时间:2015-08-14 13:09:06

标签: python python-2.7 oop

我在Python 2-Code(2.7.9)中收到以下错误消息: TypeError:unbound方法issueTransitionJIRA()必须使用AccessCd实例作为第一个参数调用(改为使用AccessCd实例)

所以python抱怨第一个参数应该是我实际传递的类实例..?!当然我错过了一些东西,但我还没有得到它,在类似的错误信息上搜索其他答案......任何人都可以帮助/解释我吗?非常感谢!

这是我的代码结构:

主文件 w32AccessCd.py

import transitionStatusTracking

class AccessCd:
    def __init__(self):
        # ...
        self.main()

    def main():
        tST = transitionStatusTracking.tStateTrack(self)
        tST.setup()

    # ...

    def issueTransitionJ(self, issuekey, workflowcmd):
        # ...
        return True     


accesscd = AccessCd()

module-file transitionStatusTracking.py

from w32AccessCd import AccessCd

class tStateTrack:

    def __init__(self, ACCESSCD):
        self.ACCESSCD = ACCESSCD

    def setup(self):
        AccessCd.issueTransitionJ(self.ACCESSCD, self.key, "error")

错误:

TypeError: unbound method issueTransitionJ() must be called with AccessCd instance as first argument (got AccessCd instance instead)

1 个答案:

答案 0 :(得分:4)

当Python运行脚本时,该文件存储在__main__命名空间中。另一方面,将其作为模块导入会将其放在<name-of-module>命名空间中。

您正在运行w32AccessCd.py作为主脚本,定义__main__.AccessCd

然后导入transitionStatusTracking,它会转身并导入w32AccessCd。这将创建该模块的第二个副本,作为w32AccessCd命名空间。您现在拥有w32AccessCd.AccessCd。这是一个单独的类,与其他类不同。

接下来会发生什么:

  • accesscd = AccessCd()创建一个__main__.AccessCd类型的实例。
  • __main__.AccessCd.__init__来电__main__.AccessCd.main
  • __main__.AccessCd.main创建transitionStatusTracking.tStateTrack的实例,并传入__main__.AccessCd个实例。
  • 您调用transitionStatusTracking.tStateTrack.setup方法,该方法尝试将w32AccessCd.AccessCd.issueTransitionJ()方法与__main__.AccessCd实例一起使用,并且调用失败。

您有三种方法可以解决此问题:

  • transitionStatusTracking模块中,从__main__导入:

    from __main__ import AccessCd
    

    要使循环导入工作,您必须将import transitionStatusTracking行移到下面的 class AccessCd块,否则该类尚未定义。或者,在代码中使用import __main__和参考__main__.AccessCd

    现在你有同一个班级。

  • 创建第三个文件来执行脚本编写;说main.py,用:

    from w32AccessCd import AccessCd
    accesscd = AccessCd()
    

    并从accesscd = AcessCd()模块中删除w32AccessCd行。现在只传递w32AccessCd.AccessCd类实例。

  • 直接调用方法 而不是解绑:

    def setup(self):
        self.ACCESSCD.issueTransitionJ(self.key, "error")
    

    这可以确保方法绑定到正确的实例,并且不再重视该类的来源。