python - 有没有一种可靠的方法来列出一个类的所有 __slots__?
问题描述
我正在寻找一种方法来可靠地获取具有__slots__
. 例子:
class A:
__slots__ = ('a',)
print(list_slots(A)) # should output ['a']
当然,这可以通过 来完成list(A.__slots__)
,但不幸的是,有几件事使这变得更加困难:
继承槽:
class B(A): __slots__ = ('b',) print(list_slots(B)) # should output ['a', 'b']
字符串:
class C: __slots__ = 'xyz' print(list_slots(C)) # should output ['xyz']
迭代器:
class D: __slots__ = iter(['d']) print(list_slots(D)) # should output ['d']
如您所见,这里有很多陷阱……是否有list_slots
正确处理所有这些情况的实现?
解决方案
我会inspect.ismemberdescriptor
在这种情况下使用(doc):
import inspect
class A:
__slots__ = ('a',)
class B(A):
__slots__ = ('b',)
class X(B):
__slots__ = ('c',)
class C:
__slots__ = 'xyz'
class D:
__slots__ = iter(['d'])
def get_slots(cls):
for k, v in cls.__dict__.items():
if inspect.ismemberdescriptor(v):
yield k
for b in cls.__bases__:
yield from get_slots(b)
print(list(get_slots(A)))
print(list(get_slots(B)))
print(list(get_slots(C)))
print(list(get_slots(D)))
print(list(get_slots(X)))
印刷:
['a']
['b', 'a']
['xyz']
['d']
['c', 'b', 'a']
编辑1:更新了我对递归版本的回答get_slots()
编辑 2:正如 Aran-Fey 在评论中指出的那样,此解决方案仅适用于 CPython。
推荐阅读
- c# - C# Timer 检查多线程是否完成失败
- html - 使用 CSS 在图像上绘制圆圈
- django - 在 Django 频道消费者中使用 asyncio.create_subprocess_shell
- php - HTML POST 表单不向 PHP 脚本发送任何数据
- javascript - 从已解决的 Promise 对象中检索值
- python - 测试请求 Modbus TCP
- javascript - 如何在没有帮助的情况下更新 Meteor 中的 div?
- javascript - 角度材料对话框预填充的输入字段未验证
- python-3.x - 串口通信编码
- react-router - React Router v4 - 路由渲染属性问题