Python 获取所有可能的类属性的完整列表
给定一个简单的类,有没有一种方法可以输出它所有可能的属性?标准属性,如Python 获取所有可能的类属性的完整列表,python,python-3.x,attributes,python-2.x,Python,Python 3.x,Attributes,Python 2.x,给定一个简单的类,有没有一种方法可以输出它所有可能的属性?标准属性,如\uuuuu class\uuuuu和\uuuu doc\uuuu和\uuuu mro\uuuuu,\uuuu base\uuuuuu等。一般来说,所有属性都存在吗 考虑一个类最简单的情况: class myClass: pass dir()、vars()和inspect.getmembers()都排除了某些内置属性。最完整的列表是通过使用myClass.\uuuu dir\uuuu(myClass)提供的,该列表在
\uuuuu class\uuuuu
和\uuuu doc\uuuu
和\uuuu mro\uuuuu
,\uuuu base\uuuuuu
等。一般来说,所有属性都存在吗
考虑一个类最简单的情况:
class myClass:
pass
dir()
、vars()
和inspect.getmembers()
都排除了某些内置属性。最完整的列表是通过使用myClass.\uuuu dir\uuuu(myClass)
提供的,该列表在添加内置属性时,排除了myClass
的用户定义属性,例如:
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'}
根据增加的一个类似问题,这是不可能的。如果目前仍然不可能,那么“隐藏”某些属性(如\uuuuuu base\uuuuu
(从标准调用到dir()、vars()&inspect)的基本原理是什么
类似问题:
-
这是最有可能被标记为重复的,但是,它是旧的,主要是关于
Python2.x
。公认的答案是没有办法,但它是在08年提供的。12'中的最新答案建议新样式类使用dir()
-
相似的标题,不同的内容
-
提供
dir()
和inspect
解决方案
-
再次建议
dir()
基本上是一种方便的方法,它不应该返回所有内容,它基本上是递归地返回在类及其基的字典中找到的所有内容
很容易理解:
def dir(*args):
...
elif isinstance(obj, (types.TypeType, types.ClassType)):
# Don't look at __class__, as metaclass methods would be confusing.
return sorted(_classdir(obj))
...
def _classdir(klass):
"""Return a set of the accessible attributes of class/type klass.
This includes all attributes of klass and all of the base classes
recursively.
"""
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:
# Note that since we are only interested in the keys, the order
# we merge classes is unimportant
for base in bases:
names.update(_classdir(base))
return names
由于每个类基本上都继承自对象
,您将看到一些dunder方法,因为它们实际上是对象
字典的一部分:
>>> class A(object):
pass
...
>>> set(dir(A)) == set(list(object.__dict__) + list(A.__dict__))
True
那么\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
首先,对象本身是某事物的实例:
因此,当我们做A时,实际上是在查找A,即类型
:
>>> list(type.__dict__)
['__module__', '__abstractmethods__', '__getattribute__', '__weakrefoffset__', '__dict__', '__lt__', '__init__', '__setattr__', '__subclasses__', '__new__', '__base__', '__mro__', 'mro', '__dictoffset__', '__call__', '__itemsize__', '__ne__', '__instancecheck__', '__subclasscheck__', '__gt__', '__name__', '__eq__', '__basicsize__', '__bases__', '__flags__', '__doc__', '__delattr__', '__le__', '__repr__', '__hash__', '__ge__']
>>> A.__bases__
(<type 'object'>,)
>>> type(A).__dict__['__bases__'].__get__(A, type)
(<type 'object'>,)
由于type
是object
的子类,因此type
上的dir()
调用将包含object
中的一些项:
>>> set(dir(type)) - set(type.__dict__)
set(['__reduce_ex__', '__str__', '__format__', '__reduce__', '__class__', '__subclasshook__', '__sizeof__'])
可能是重复的你甚至没有读过我的问题,是吗?2.x的答案没有过时。你可以写\uuuuu getattr\uuuuu
来做任何事情。我有几个类,其中\uuuu getattr\uuuuu
说需要查询URL-没有办法提前知道该URL将返回什么,因此无法生成URL查看一个详尽的属性列表。\uuuuuu dir\uuuuu
大多数时候都会返回大多数属性,但由于获取和设置属性的动态特性,确实无法始终获取完整的列表。至于为什么\uuuu base\uuuuu
是隐藏的,而不是\uu name\uuuu
,我无法告诉您。这就是为什么问题被标记为Python3.x
,而不是Python2.x
。另一个问题通常是关于Python的。它适用于2.x和3.x。这个问题是其中的一个子问题。答案已经在那里了。我明白了,所以我最初关于它们是隐藏的假设是非常错误的,像\uuu base\uuuuuuuu
这样的属性只是不正确的从type
派生,因此调用类似dir()的函数
在类型的子类上
不会返回继承的属性。另外,关于存在一个获取所有内容的函数,我猜简单的答案是,如果我想要这样的函数,最好自己实现,因为它不存在,对吧?@DimitrisJim几乎正确,但是“dir()
类型的子类上的应该是“dir()
类型的实例上的”,例如,如果您创建了一个具有某些属性的元类,那么它的实例(也称为类)我们看不到这些属性,但属性访问仍然有效。不,没有这样的函数可用,至少在标准库中没有。好的,我明白了。我唯一没有得到的东西(也许我应该问另一个问题)再次给出一个空的类定义,为什么像\uuuuuuuuuuuuuuuu
这样的类型
的某些继承属性在\uuuuuuuuuuuuuuuuu
和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>中可见,或者\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu__
不是:set(dir(A))==set(list(object.\uu dict\uu)+list(A.\uu dict\uu))
。Python 2:;Python 3:谢谢,Ashwini。我想我明白了。如果我再次迷路,我会问一个相关的问题。再见!
>> class A(object):
... spam = 'eggs'
...
>>> a = A()
>>> a.foo = 100
>>> a.bar = 200
>>> a.__dict__
{'foo': 100, 'bar': 200}
>>> A.__dict__
dict_proxy({'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__main__', '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None, 'spam': 'eggs'})
>>> set(dir(type)) - set(type.__dict__)
set(['__reduce_ex__', '__str__', '__format__', '__reduce__', '__class__', '__subclasshook__', '__sizeof__'])