1
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 内置函数的帮助文件中可能存在问题。例如:

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

4 回答 4

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)

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

于 2013-01-25T02:01:44.300 回答
2
  1. 方法Python 中的属性。

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

于 2013-01-25T01:28:46.233 回答
1

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

>>> type(AddrBookEntry('tom','123').phone)
<type 'str'>
>>> type(AddrBookEntry('tom','123').updatePhone)
<type 'instancemethod'>
于 2013-01-25T01:38:43.027 回答
-1

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

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

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

于 2013-01-25T02:01:14.677 回答