我在Python 2-Code(2.7.9)中得到以下错误消息:
类型错误:必须以AccessCd实例作为第一个参数调用未绑定方法issueTransitionJIRA()(改为获取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()

模块文件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)

最佳答案

当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__和reference__main__.AccessCd
现在你有了同一个班。
创建第三个文件来执行脚本;说main.py,使用:
from w32AccessCd import AccessCd
accesscd = AccessCd()

并从accesscd = AcessCd()模块中删除w32AccessCd行。现在将只传递w32AccessCd.AccessCd类实例。
直接调用方法而不是取消绑定:
def setup(self):
    self.ACCESSCD.issueTransitionJ(self.key, "error")

这将确保方法绑定到正确的实例,并且类来自何处不再重要。

关于python - 必须以X实例作为第一个参数调用未绑定(bind)方法(改为使用X实例),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32010905/

10-12 04:49