给定一个任何类型的Python对象,是否有一种简单的方法来获得该对象拥有的所有方法的列表?
或者如果这是不可能的,是否至少有一种简单的方法来检查它是否具有特定的方法,而不是在调用方法时检查是否发生错误?
给定一个任何类型的Python对象,是否有一种简单的方法来获得该对象拥有的所有方法的列表?
或者如果这是不可能的,是否至少有一种简单的方法来检查它是否具有特定的方法,而不是在调用方法时检查是否发生错误?
当前回答
大多数时候,我想看到用户定义的方法,我不想看到以'__'开头的内置属性,如果你想,你可以使用以下代码:
object_methods = [method_name for method_name in dir(object) if callable(getattr(object, method_name)) and '__' not in method_name]
例如,对于这个类:
class Person:
def __init__(self, name):
self.name = name
def print_name(self):
print(self.name)
上面的代码将输出:['print_name']
其他回答
大多数时候,我想看到用户定义的方法,我不想看到以'__'开头的内置属性,如果你想,你可以使用以下代码:
object_methods = [method_name for method_name in dir(object) if callable(getattr(object, method_name)) and '__' not in method_name]
例如,对于这个类:
class Person:
def __init__(self, name):
self.name = name
def print_name(self):
print(self.name)
上面的代码将输出:['print_name']
你可以使用Python中预定义的dir()。
import module_name
dir(module_name)
你也可以把一个对象传递给dir() as
dir(object_name)
如果对象是预定义类(如int、str等)的对象,则会显示其中的方法(您可能知道这些方法是内建函数)。如果该对象是为用户定义的类创建的,它将显示该类中给出的所有方法。
这里指出的所有方法的问题是,您不能确定某个方法不存在。
在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中使用“请求原谅比请求许可更容易”的范例。
import moduleName
for x in dir(moduleName):
print(x)
这应该工作:)
对于许多对象,你可以使用这段代码,用你感兴趣的对象替换'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'])