>>> with open('demomodule.py', 'w') as demomodule:
... demomodule.write('class Foo: pass\n')
...
16
>>> import sys
>>> from demomodule import Foo # first import
>>> id(Foo)
140579578254536
>>> import demomodule # just another reference, module is not run again
>>> id(demomodule.Foo)
140579578254536
>>> del sys.modules['demomodule'] # removing the module object
>>> import demomodule # this causes it to be imported again
>>> id(demomodule.Foo)
140579574812488
执行
class
语句时,总是创建一个新的类对象。类不是单例。通过将class
语句放入函数中,您可以多次执行它。你知道吗模块级的类语句只执行一次,因为在第一次导入时,模块只执行一次。你知道吗
您可以通过从
sys.modules
结构中删除module对象来绕过此问题;您将注意到第三次导入的Foo
类在我们删除模块后是另一个对象:当您以脚本形式运行模块,然后使用
import
导入相同的模块时,也会发生同样的情况;脚本以__main__
模块形式运行,使用import
再次导入脚本,然后还为导入的名称创建单独的模块对象:Python本质上是高度动态的;应用优化(比如缓存函数生成的类对象)充满了问题。您的函数可能不接受任何参数,但它不是在真空中运行的。例如,我可以替换
__build_class__
hook函数,并将一个额外的类插入Python中任何地方创建的类的基中:Python中充满了这样的钩子。你知道吗
相关问题 更多 >
编程相关推荐