首页 > 解决方案 > 有没有一种可靠的方法来列出一个类的所有 __slots__?

问题描述

我正在寻找一种方法来可靠地获取具有__slots__. 例子:

class A:
    __slots__ = ('a',)

print(list_slots(A))  # should output ['a']

当然,这可以通过 来完成list(A.__slots__),但不幸的是,有几件事使这变得更加困难:

如您所见,这里有很多陷阱……是否有list_slots正确处理所有这些情况的实现?

标签: pythonattributesslots

解决方案


我会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。


推荐阅读