获取所有可能的类属性的完整列表。

24 浏览
0 Comments

获取所有可能的类属性的完整列表。

对于一个简单的类,有没有一种方法可以输出它的所有可能属性?包括标准属性如__class____doc__,以及特殊的只读属性__mro____bases__等等。总之,所有的当前属性?\n考虑到一个最简单的类的情况:\n

class myClass:
    pass

\ndir()vars()inspect.getmembers()都会排除某些内置属性。最完整的列表是通过使用myClass.__dir__(MyClass)来获得的,它在添加内置属性的同时,排除了用户定义的MyClass的属性,例如:\n

In [3]: set(MyClass.__dir__(MyClass)) - set(dir(MyClass))
Out[3]: 
{'__abstractmethods__', '__base__', '__bases__',
 '__basicsize__', '__call__', '__dictoffset__',
 '__flags__', '__instancecheck__', '__itemsize__',
 '__mro__', '__name__', '__prepare__', '__qualname__',
 '__subclasscheck__', '__subclasses__', '__text_signature__',
 '__weakrefoffset__', 'mro'}

\n根据一个相关的附加问题,目前是不可能的。如果目前仍然不可能,那么为什么要“隐藏”某些属性,例如__bases__(从标准调用dir()vars()inspect中隐藏),而不是像__name__这样的属性呢?\n


\n

类似的问题:

\n

0
0 Comments

获取所有可能的类属性的完整列表的问题是由于Python的dir()方法的实现机制导致的。dir()方法实际上是一个方便的方法,它并不打算返回所有内容,它的基本原理是递归地返回类和其基类的字典中的所有内容。

解决这个问题的方法是自己实现一个函数来获取所有可能的类属性。下面是一个示例实现:

def get_all_class_attributes(klass):
    names = set()
    ns = getattr(klass, '__dict__', None)
    if ns is not None:
        names.update(ns)
    bases = getattr(klass, '__bases__', None)
    if bases is not None:
        for base in bases:
            names.update(get_all_class_attributes(base))
    return names

需要注意的是,由于每个类实际上都继承自object,所以在返回的类属性中会包含一些dunder方法,因为它们实际上是object的字典的一部分。

此外,__bases__等一些缺失的属性实际上是属于type的,而不是类本身。当我们调用dir()方法时,对type的调用会返回一些object的属性。

通过自己实现一个函数来获取所有可能的类属性是解决这个问题的方法。这样就可以完整地列出所有可能的类属性。

0