python中的dir函数

时间:2013-01-25 01:26:10

标签: python

help(dir):
dir([object]) -> list of strings        
If called without an argument, return the names in the current scope.  
Else, return an alphabetized list of names comprising (some of) the attributes  
of the given object, and of attributes reachable from it.  
If the object supplies a method named __dir__, it will be used; otherwise  
the default dir() logic is used and returns:  
  for a module object: the module's attributes.  
  for a class object:  its attributes, and recursively the attributes  
    of its bases.  
  for any other object: its attributes, its class's attributes, and  
    recursively the attributes of its class's base classes.

我发现dir builtin function的帮助文件中可能存在问题。例如:

class  AddrBookEntry(object):
   'address book entry class'
   def __init__(self,nm,ph):
     self.name=nm
     self.phone=ph
   def updatePhone(self,newph):
     self.phone=newph
     print 'Updated phone # for :' ,self.name

dir(AddrBookEntry('tom','123'))
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'phone', 'updatePhone']

1. dir()可以列出对象的方法,而不仅仅是属性
updatePhone是方法,而不是属性。

2.我怎么知道哪个是属性,这是dir()输出中的方法?

4 个答案:

答案 0 :(得分:2)

  1. 方法是Python中的属性。

  2. 检查它们的各种属性。方法具有im_*属性。

答案 1 :(得分:2)

你可以感受到区别,但方法属性,所以唯一可以确定的方法是检查。

这是一个可以为你分解的功能:

def dirf(obj=None):
    """Get the output of dir() as a tuple of lists of callables and non-callables."""
    d = ([],[])
    for name in dir(obj):
        if callable(getattr(obj, name, locals().get(name))):
            d[0].append(name)
        else:
            d[1].append(name)
    return d

inspect.getmembers有一个很好的获取可调用成员的快捷方式:

from inspect import getmembers
getmembers(obj, callable)

但要小心自己的谓词!对于在Python 中实现的方法inspect.ismethod只会True。许多核心对象的方法(例如[].sort)不符合该标准。

答案 2 :(得分:1)

帮助文件是正确的。在Python中,方法以与任何其他属性完全相同的方式附加到类(以及这些类的实例)。为了区分简单属性和可调用属性,您必须取消引用它:

>>> type(AddrBookEntry('tom','123').phone)
<type 'str'>
>>> type(AddrBookEntry('tom','123').updatePhone)
<type 'instancemethod'>

答案 3 :(得分:-1)

如果您想知道对象的属性,请使用__dict__属性。 E.g:

>>> entry = AddrBookEntry('tom','123')
>>> entry.__dict__
{'name': 'tom', 'phone': '123'}

dir()用于调试。在生产代码中使用它可能是个坏主意。究竟它返回的内容定义不明确。