我在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)
答案 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")
这可以确保方法绑定到正确的实例,并且不再重视该类的来源。