[python] globals()['Foo']=value 和 setattr(module, 'Foo', value) 的区别是什么?
ringa_lee
ringa_lee 2017-04-17 11:50:36
[Python讨论组]

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') 
ringa_lee
ringa_lee

ringa_lee

全部回复(1)
高洛峰

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号