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