给定一个任何类型的Python对象,是否有一种简单的方法来获得该对象拥有的所有方法的列表?
或者如果这是不可能的,是否至少有一种简单的方法来检查它是否具有特定的方法,而不是在调用方法时检查是否发生错误?
给定一个任何类型的Python对象,是否有一种简单的方法来获得该对象拥有的所有方法的列表?
或者如果这是不可能的,是否至少有一种简单的方法来检查它是否具有特定的方法,而不是在调用方法时检查是否发生错误?
当前回答
可以创建一个getAttrs函数,该函数将返回对象的可调用属性名
def getAttrs(object):
return filter(lambda m: callable(getattr(object, m)), dir(object))
print getAttrs('Foo bar'.split(' '))
那就回来
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
'__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__',
'__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__',
'__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop',
'remove', 'reverse', 'sort']
其他回答
对于许多对象,你可以使用这段代码,用你感兴趣的对象替换'object':
object_methods = [method_name for method_name in dir(object)
if callable(getattr(object, method_name))]
我发现它在diveintopython.net(现在存档),应该提供一些进一步的细节!
如果你得到一个AttributeError,你可以用这个代替:
getattr()不允许pandas风格的Python 3.6抽象虚拟子类。这段代码执行与上面相同的操作,并忽略异常。
import pandas as pd
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],
columns=['foo', 'bar', 'baz'])
def get_methods(object, spacing=20):
methodList = []
for method_name in dir(object):
try:
if callable(getattr(object, method_name)):
methodList.append(str(method_name))
except Exception:
methodList.append(str(method_name))
processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s)
for method in methodList:
try:
print(str(method.ljust(spacing)) + ' ' +
processFunc(str(getattr(object, method).__doc__)[0:90]))
except Exception:
print(method.ljust(spacing) + ' ' + ' getattr() failed')
get_methods(df['foo'])
import moduleName
for x in dir(moduleName):
print(x)
这应该工作:)
这里有一个很好的一行代码(但也会得到属性):
print(*dir(obj), sep='\n')
例如,如果你正在使用shell plus,你可以用这个代替:
>> MyObject??
这样,带'??’就在你的对象后面,它会显示类的所有属性/方法。
这里指出的所有方法的问题是,您不能确定某个方法不存在。
在Python中,您可以通过__getattr__和__getattribute__拦截点调用,从而可以在“运行时”创建方法。
例子:
class MoreMethod(object):
def some_method(self, x):
return x
def __getattr__(self, *args):
return lambda x: x*2
如果你执行它,你可以调用对象字典中不存在的方法…
>>> o = MoreMethod()
>>> o.some_method(5)
5
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method']
>>> o.i_dont_care_of_the_name(5)
10
这就是为什么在Python中使用“请求原谅比请求许可更容易”的范例。