dir()如何工作

时间:2014-07-23 13:18:46

标签: python

我试图理解dir()是如何运作的,我正在阅读文档,但我仍有一些疑问。

来自doc:

  

默认dir()机制对不同类型的对象的行为有所不同,因为它试图产生最相关的信息,而不是完整的信息:

     
      
  • 如果对象是模块对象,则列表包含的名称   模块的属性。
  •   
  • 如果对象是类型或类对象,则列表包含其属性的名称,并且递归地包含其属性   碱基。
  •   
  • 否则,该列表包含对象的属性'名称,类的属性名称,以及属性的递归   它的类的基类。
  •   

因为我不理解第二个和第三个之间的区别,所以我在交互式提示上做了一些实验:

>>> type(list)
<class 'type'>
>>> dir(list)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> type([])
<class 'list'>
>>> dir([])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

我不理解,我给出了一个类型对象(dir(list)),如果我给出一个列表对象(dir([])),我会得到相同的列表,那么&# 39;继续?

2 个答案:

答案 0 :(得分:2)

list实例(例如由文字[]创建的空列表对象)具有与list类相同的属性,因此您从{{获得相同的列表1}}。但是,由于您可以在Python中动态地向(某些)对象实例添加属性,但情况并非总是如此,因此在文档中进行了区分。这是一个示例,其中实例具有类不具有的属性:

dir()

答案 1 :(得分:0)

第二项专门指类型或类别;这使得第三项涵盖了类型或类的实例

请注意,dir类的A输出的最后一行与a的最后一行相比,A的实例。 a的属性y A没有。 (为了便于阅读,我将输出分成多行。)

>>> class A(object):
...   x = 3
...   def __init__(self, b):
...     self.y = b
...
>>> a = A(6)
>>> dir(A)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
 '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
 'x']
>>> dir(a)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
 '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
 'x', 'y']
>>>