当从较小规模的较大项目中复制错误时,我将问题减少为以下代码:
class Foo:
def __init__(self):
globals()["bar_class"].abc()
class Bar:
def abc(self):
self._123()
def _123(self):
print("something")
bar_class = Bar
Foo()
引发了错误:
Traceback (most recent call last):
File "H:/A) YEAR 12/Computing/solution/test_selfbug.py", line 14, in <module>
Foo()
File "H:/A) YEAR 12/Computing/solution/test_selfbug.py", line 3, in __init__
globals()["bar_class"].abc()
TypeError: abc() takes exactly 1 argument (0 given)
然而,当最后一行是:
bar_class = Bar()
Foo()
不会引发错误。我假设由于未初始化类而未创建self
,因此Bar.abc
在需要时无法访问自己。
但是,将最后一行更改为:
bar_class = Bar
bar_class()
Foo()
与以前一样引发同样的错误,当被调用时,self不会被识别为Bar.abc
的参数。这看起来很奇怪,因为Bar仍然被初始化(尽管通过bar_class变量。)
明显的答案是使用Bar
调用Bar()
,而不是在初始化之前将对象保存为变量。但是,在较大程序的上下文中,我需要能够将此对象作为变量使用globals()
来访问它(这是我在代码中工作的最佳方式)更大的计划。)
那么,我的问题是,是什么原因导致这种自我行为不被看到&#39;按bar.abc
,如何解决abc()
无法识别自我的问题,同时仍然可以通过变量访问Bar
对象?
注意: 我知道将Foo.__init__
的内容更改为bar_class.abc()
要简单得多,绝对是最干净的解决错误。但是,在完整程序的上下文中,使用globals[key]
检索对象是必要的。
答案 0 :(得分:4)
bar_class = Bar
在类 Bar
上创建别名,但不创建实例。
由于您的方法不是静态的,因此无法在没有实例的情况下调用它。
执行bar_class = Bar()
时,现在bar_class
是一个实例,并且有效。
现在:
bar_class = Bar
bar_class() # this line achieves nothing
bar_class
是Bar
(一个类),下面的行创建了一个后续垃圾收集的实例:与非工作案例#1相同
(当然bar_class = bar_class()
会起作用,但这太过分了)