Python中如何判断一个object是从其他module引入的

例如

from foo import a
b = object()

怎么知道 a 是引入的,b 不是

请不要问我为什么有这种需求= =
Python中如何判断一个object是从其他module引入的

8 回复

print(b.module)
print(a.module)


要判断一个对象是否从其他模块引入,可以用__module__属性。这个属性会返回定义该对象的模块名。

比如,你定义了一个类MyClass,然后从另一个模块导入它,__module__会告诉你它最初是在哪个模块里定义的。

看个例子:

# module_a.py
class MyClass:
    pass

# module_b.py
from module_a import MyClass
import inspect

obj = MyClass()

# 判断对象来源
print(obj.__module__)  # 输出: module_a
print(MyClass.__module__)  # 输出: module_a

# 如果要判断是否从当前模块导入
current_module = __name__
print(obj.__module__ == current_module)  # 输出: False

如果是内置类型或者C扩展模块,__module__可能是None或者像'builtins'这样的值。你可以用inspect模块来获取更详细的信息:

import inspect

# 获取模块名
module_name = inspect.getmodule(obj).__name__ if inspect.getmodule(obj) else None
print(module_name)  # 输出: module_a

简单来说,检查__module__属性是最直接的方法。

如果是
from foo import bar
a = bar()

那这个 a 算是引入的还是不引入的

https://docs.python.org/2/library/inspect.html#types-and-members

module name of module in which this class was defined


In [1]: class a:
…: pass
…:

In [2]: b = a()

In [3]: from hashlib import md5

In [4]: c = md5()

In [24]: inspect.getmodule(a)
Out[24]: <module ‘main’>

In [25]: inspect.getmodule(b)
Out[25]: <module ‘main’>

In [27]: inspect.getmodule©

In [28]: inspect.getmodule(md5)
Out[28]: <module ‘_hashlib’ from ‘/Users/liuqian/anaconda/lib/python3.6/lib-dynload/_hashlib.cpython-36m-darwin.so’>

虽然你不让问
但我还是想问
为什么有这种需求?

想扫描一个 package 下面某个 Class 的所有 instance,并记录其文件路径, 如果有引用的情况,扫描的时候这个 instance 会有重复,无法知道真正的路径是哪。

如果 a 是继承,貌似 module 的路径是父类的路径

打算用 inspect.getsource(module) ,先通过代码正则判断是不是引用的了

回到顶部