使用某些初始化方法调用时,方法无法访问自身

时间:2017-02-24 13:09:00

标签: python self

当从较小规模的较大项目中复制错误时,我将问题减少为以下代码:

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]检索对象是必要的。

1 个答案:

答案 0 :(得分:4)

bar_class = Bar Bar上创建别名,但不创建实例。

由于您的方法不是静态的,因此无法在没有实例的情况下调用它。

执行bar_class = Bar()时,现在bar_class是一个实例,并且有效。

现在:

bar_class = Bar
bar_class()    # this line achieves nothing

bar_classBar(一个类),下面的行创建了一个后续垃圾收集的实例:与非工作案例#1相同

(当然bar_class = bar_class()会起作用,但这太过分了)