假设有一些类:
class Test():
pass
Run Code Online (Sandbox Code Playgroud)
mro()在类实例化时调用,其结果存储在__mro__.
好的,这对我来说仍然很清楚,因为__mro__确实存储了一些东西:
Test.__mro__
Out[48]: (__main__.Test, object)
Run Code Online (Sandbox Code Playgroud)
再一次,我在某处读到了这个:
要查找属性名称 Python 搜索:
a) 搜索在 C 处找到__dict__的所有元类__mro__的__class__。
b) 如果在步骤 a 中找到数据描述符,则调用它__get__()并退出。
c) 否则,__dict__在 C 自己的类的 中调用描述符或返回值__mro__。
d) 调用在步骤 a 中找到的非数据描述符。
e)否则,返回元类树值
我可以发现没有__mro__in Test.__dict__:
'__mro__' in Test.__dict__
Out[49]: False
Run Code Online (Sandbox Code Playgroud)
因此,根据e之前引用的条款,我想这
__mro__应该取自“元类树值”,因此取自type.__dict__
真的,还有__mro__在type.__dict__:
["mro:<method 'mro' …Run Code Online (Sandbox Code Playgroud) 假设我们正在创建一个app通过构造新vm.SourceTextModule对象来调用的模块:
const context = {
exports: {},
console, // custom console object
};
const sandbox = vm.createContext(context);
const app = new vm.SourceTextModule(
`import path from 'path';
console.log(path.resolve('./src'));`,
{
context: sandbox,
}
);
Run Code Online (Sandbox Code Playgroud)
根据Node.js 文档,要从模块获取默认导出,path我们应该将模块导入的依赖项“链接”app到它。
为了实现这一点,我们应该将linker回调传递给app.link方法:
async function linker(specifier, referencingModule) {
// the desired logic...
}
await app.link(linker);
Run Code Online (Sandbox Code Playgroud)
如何linker正确实现功能,以便我们可以path在新创建的模块中导入模块app并使用它:
await app.evaluate(); // => /home/user/Documents/project/src
Run Code Online (Sandbox Code Playgroud)
PS 我们正在使用TypeScript,所以我检查了我们是否安装了path包的类型。
包.json …