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

[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):

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' 
('call', 'foo_str') 
('call', 'new str') 

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

【热门文章】
【热门文章】