[python] globals()['Foo']=value 和 setattr(module, 'Foo', value) 的区别是什么?

foo.py

class Foo(object):
    foo_str = 'foo_str'

    def __call__(self):
        print('call', Foo.foo_str)

    @staticmethod
    def config(arg=None):
        if arg:
            Foo.foo_str = arg
        import sys
        foo = Foo()
        foo.Foo = Foo
        foo.config = Foo.config
        sys.modules['foo'] = foo
        globals()['Foo'] = foo.Foo      #1
        #setattr(foo, 'Foo', foo.Foo)  #2 

Foo.config()

bar.py

import foo

foo()
foo.config('new str')
foo()

为什么bar.py的运行情况是(python 2.7.3):

  • 只注释掉1报错
Traceback (most recent call last):                           
  File "bar.py", line 3, in <module>                         
    foo()                                                    
  File "/tmp/foo.py", line 5, in __call__            
    print('call', Foo.foo_str)                               
AttributeError: 'NoneType' object has no attribute 'foo_str' 
  • 只注释掉2正常
('call', 'foo_str') 
('call', 'new str') 
阅读 4.3k
1 个回答

Foo.call函数中的Foo.foo_str中的Foo引用的是globals()['Foo']。也就是说当只注释1的时候,没有为globals()['Foo']设置值,那么就是None。
代码#2那行的意思等同于foo.Foo = foo.Foo而这个foo是config函数的局部变量foo。所以这行注释不注释没啥意义。
推荐楼主Google一下Python的globals函数,了解一下这个函数的作用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题