python - 是否有可能找出一个类的实例是否有 __dict__ ?

标签 python python-3.x

给定一个任意类X作为输入,是否可以找出X的实例是否具有__dict__


我尝试了 hasattr(X, '__dict__'),但这不起作用,因为它检查类对象是否具有 __dict__:

>>> hasattr(int, '__dict__')
True
>>> vars(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: vars() argument must have __dict__ attribute

缺少__slots__也不能保证存在__dict__:

>>> hasattr(int, '__slots__')
False
>>> vars(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: vars() argument must have __dict__ attribute

我还考虑过使用 object.__new__(X) 创建 X 的实例(以绕过 X.__new__X .__init__,这可能会产生不需要的副作用),但这对于内置类型会失败:

>>> hasattr(object.__new__(int), '__dict__')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object.__new__(int) is not safe, use int.__new__()

是否可以在不调用任何未知/不受信任的代码(例如 X 的构造函数)的情况下执行此操作?

最佳答案

dir() 将列出 Python3 中的 __dict__,例如:

>>> class MyInt(int):
...     pass
...
>>> '__dict__' in dir(int)
False
>>> '__dict__' in dir(MyInt)
True
>>>

关于python - 是否有可能找出一个类的实例是否有 __dict__ ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48789322/

相关文章:

python - 通过 pkexec 执行时缺少环境变量

python - 如何将python文件编译为exe文件?

python-3.x - ZeroMQ永久拉线 socket

python - 如何杀死正在运行的线程

python-3.x - 使用鼠标在 python tkinter Canvas 上绘制并获取指向列表的点?

Python 从 CSV 创建嵌套列表

python - 如何使用 python 获取 FTP 的当前工作目录

python - 将样本编号附加到 altair 中的 X-Labels

python - 在 Python 中将类的实例追加到列表中会产生副本而不是引用

python - 导入错误 : No module named 'cv2' Python3