Methods are attributes in Python.
Check the various attributes on them. Methods have
im_*
attributes.
سؤال
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.
i found maybe there are problems in the help file of dir builtin function.for example:
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()
can list the method of object ,not only attributes
the updatePhone
is method ,not attribute.
2.how can i know which is the attribute,which is method in the output of dir()?
المحلول
نصائح أخرى
You kind of get a feel for telling the difference, but methods are attributes, so the only way to be really sure is to check.
Here's a function that will break it down for you:
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
has a nice shortcut for getting callable members:
from inspect import getmembers
getmembers(obj, callable)
but beware of its own predicates! inspect.ismethod
will only be True
for methods implemented in Python. Many core objects' methods ([].sort
, for example) do not meet that criteria.
The help file is correct. In Python, methods are attached to classes (and instances of those classes) in exactly the same way as any other attribute. In order to distinguish a simple attribute from a callable one, you'll have to dereference it:
>>> type(AddrBookEntry('tom','123').phone)
<type 'str'>
>>> type(AddrBookEntry('tom','123').updatePhone)
<type 'instancemethod'>
If you want to know the attributes of an object use the __dict__
attribute. E.g.:
>>> entry = AddrBookEntry('tom','123')
>>> entry.__dict__
{'name': 'tom', 'phone': '123'}
dir()
is intended for debugging. Using it in production code is probably a bad idea. Exactly what it returns isn't very well defined.