获取所有可能的类属性的完整列表。
获取所有可能的类属性的完整列表。
对于一个简单的类,有没有一种方法可以输出它的所有可能属性?包括标准属性如__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
- \n
- 如何获得一个对象的所有方法和属性的完整列表? \n
\n这可能会被标记为重复问题,但是,它是旧的,主要涉及
Python 2.x
。接受的答案是没有办法,但是提供了一个在08\'年提供的方法。12\'年最新的答案建议使用dir()
来处理新的风格的类。\n - 打印Python类的所有属性 \n
\n标题相似,但内容不同。\n
- 获取类的属性\n
\n提供了
dir()
和inspect
的解决方案。\n - 在Python中获取所有对象属性? \n
\n再次提出了
dir()
的解决方案。\n
\n
\n
\n
\n
获取所有可能的类属性的完整列表的问题是由于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
的属性。
通过自己实现一个函数来获取所有可能的类属性是解决这个问题的方法。这样就可以完整地列出所有可能的类属性。