ohe*_*ohe 2 python import reload isinstance
给定以下两个.py文件:
aclass.py
class A(object):
pass
Run Code Online (Sandbox Code Playgroud)
main.py
def importer(klass):
"""
Used to import classes from there python qalname
"""
import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)
klass = klass.split('.')
module = '.'.join(klass[:-1])
klass = klass[-1]
return import_(module, klass)
from aclass import A
import_A = importer('aclass.A')
print isinstance(A(), import_A) # Expected to be true
print isinstance(import_A(), A) # Expected to be true
Run Code Online (Sandbox Code Playgroud)
在此阶段,一切正常(我的程序打印True\nTrue),但是如果我修改importer方法以强制重新加载,即:
这行:
import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)
Run Code Online (Sandbox Code Playgroud)
替换为:
import_ = lambda m, k: getattr(reload(__import__(m, fromlist=k)), k)
Run Code Online (Sandbox Code Playgroud)
我的程序返回
False
False
Run Code Online (Sandbox Code Playgroud)
而且我不了解这种行为。
在这种情况下,重新加载模块意味着重新执行其内容class A(object): pass。因此,它创建了另一个不同的类。与以下行为相同:
class A(object):
pass
a = A()
class A(object): # a different class
pass
print isinstance(a, A) # False
Run Code Online (Sandbox Code Playgroud)
这足以说明为什么裸露reload()通常是个坏主意。我确信其他人可以指向实现更复杂的重装过程的框架,例如,修补旧类以使其与新类相同。
| 归档时间: |
|
| 查看次数: |
701 次 |
| 最近记录: |