我在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/