cod*_*ape 299

一个例子(列出optparse.OptionParser类的方法):

>>> from optparse import OptionParser
>>> import inspect
>>> inspect.getmembers(OptionParser, predicate=inspect.ismethod)
[([('__init__', <unbound method OptionParser.__init__>),
...
 ('add_option', <unbound method OptionParser.add_option>),
 ('add_option_group', <unbound method OptionParser.add_option_group>),
 ('add_options', <unbound method OptionParser.add_options>),
 ('check_values', <unbound method OptionParser.check_values>),
 ('destroy', <unbound method OptionParser.destroy>),
 ('disable_interspersed_args',
  <unbound method OptionParser.disable_interspersed_args>),
 ('enable_interspersed_args',
  <unbound method OptionParser.enable_interspersed_args>),
 ('error', <unbound method OptionParser.error>),
 ('exit', <unbound method OptionParser.exit>),
 ('expand_prog_name', <unbound method OptionParser.expand_prog_name>),
 ...
 ]
Run Code Online (Sandbox Code Playgroud)

请注意,getmembers返回2元组的列表.第一项是成员的名称,第二项是值.

您还可以将实例传递给getmembers:

>>> parser = OptionParser()
>>> inspect.getmembers(parser, predicate=inspect.ismethod)
...
Run Code Online (Sandbox Code Playgroud)

  • `inspect.isroutine`可能是一个更合适的谓词; `inspect.ismethod`不适用于所有对象的方法. (8认同)
  • 完美,谓词部分是关键,否则你得到与__dict__相同的东西与额外的元信息.谢谢. (4认同)
  • 在 Python 3 中,不存在未绑定方法这样的东西。在 3.7 中,这适用于以下类:`inspect.getmembers(OptionsParser, predicate=inspect.isfunction)` (3认同)
  • 这会生成类中所有方法的列表(包括从其他类继承的方法),还是只列出在该类中明确定义的方法? (2认同)
  • 在 python 3.7 上至少这不起作用,你必须实例化该类 (2认同)

Vin*_*ter 190

有一种dir(theobject)方法可以列出对象的所有字段和方法(作为元组)和inspect模块(作为代码编写),用文档列出字段和方法(在""中).

因为可以在Python中调用所有(甚至字段),所以我不确定是否有内置函数仅列出方法.如果您通过的对象dir可调用的,您可能想尝试.

  • dir(object)是我使用过的最简单的解决方案。 (2认同)

Der*_*ist 98

没有外部库的Python 3.x答案

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func))]
Run Code Online (Sandbox Code Playgroud)

被排除在外的结果:

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func)) and not func.startswith("__")]
Run Code Online (Sandbox Code Playgroud)

  • 很酷,但它不包括用 `@property` 和 `@property.setter` 装饰的 getter-setter 方法 (2认同)

Eug*_*kin 27

试试这家酒店__dict__.

  • 我想你的意思是__dict__.但是它列出了实例的属性,而不是方法. (14认同)
  • @me_and你可能正在做"self .__ dict__",或者更一般地说,调用`__dict__`的实例版本.但是类也有一个`__dict__`,它应该显示类方法:) (3认同)
  • ……这对我也不起作用。查阅了 Markdown 语法后,我想我的意思是 \_\_dict\_\_。 (2认同)

Nar*_*shi 25

假设您想知道与列表类关联的所有方法Just Type以下内容

 print (dir(list))
Run Code Online (Sandbox Code Playgroud)

上面将为您提供列表类的所有方法

  • `print([ m for m in dir(my_class) if not m.startswith('__')])` (4认同)
  • 这是最好的解决方案 (2认同)

Sea*_*aux 18

您还可以从类型中导入FunctionType并使用以下命令对其进行测试class.__dict__:

from types import FunctionType

class Foo:
    def bar(self): pass
    def baz(self): pass

def methods(cls):
    return [x for x, y in cls.__dict__.items() if type(y) == FunctionType]

methods(Foo)  # ['bar', 'baz']
Run Code Online (Sandbox Code Playgroud)

  • 您可以通过使用带有 `type()` 的一次性 lambda 来摆脱 `FunctionType` 的 `import`:`type(lambda:0)` (2认同)

小智 16

您可以使用以下代码列出 python 类中的所有方法

dir(className)
Run Code Online (Sandbox Code Playgroud)

这将返回类中所有方法名称的列表

  • 这还报告非方法类属性。 (3认同)

sat*_*aha 12

请注意,您需要考虑是否需要结果中包含的继承(但未覆盖)的基类方法.在dir()inspect.getmembers()操作做包括基类的方法,但使用的__dict__属性没有.


imb*_*arr 8

我只是将其保留在那里,因为评分最高的答案尚不清楚

这是一个简单的测试,具有基于枚举的非常规类。

# -*- coding: utf-8 -*-
import sys, inspect
from enum import Enum

class my_enum(Enum):
    """Enum base class my_enum"""
    M_ONE = -1
    ZERO = 0
    ONE = 1
    TWO = 2
    THREE = 3

    def is_natural(self):
            return (self.value > 0)
    def is_negative(self):
            return (self.value < 0)

def is_clean_name(name):
    return not name.startswith('_') and not name.endswith('_')
def clean_names(lst):
    return [ n for n in lst if is_clean_name(n) ]
def get_items(cls,lst):
    try:
            res = [ getattr(cls,n) for n in lst ]
    except Exception as e:
            res = (Exception, type(e), e)
            pass
    return res


print( sys.version )

dir_res = clean_names( dir(my_enum) )
inspect_res = clean_names( [ x[0] for x in inspect.getmembers(my_enum) ] )
dict_res = clean_names( my_enum.__dict__.keys() )

print( '## names ##' )
print( dir_res )
print( inspect_res )
print( dict_res )

print( '## items ##' )
print( get_items(my_enum,dir_res) )
print( get_items(my_enum,inspect_res) )
print( get_items(my_enum,dict_res) )
Run Code Online (Sandbox Code Playgroud)

这就是输出结果。

3.7.7 (default, Mar 10 2020, 13:18:53) 
[GCC 9.2.1 20200306]
## names ##
['M_ONE', 'ONE', 'THREE', 'TWO', 'ZERO']
['M_ONE', 'ONE', 'THREE', 'TWO', 'ZERO', 'name', 'value']
['is_natural', 'is_negative', 'M_ONE', 'ZERO', 'ONE', 'TWO', 'THREE']
## items ##
[<my_enum.M_ONE: -1>, <my_enum.ONE: 1>, <my_enum.THREE: 3>, <my_enum.TWO: 2>, <my_enum.ZERO: 0>]
(<class 'Exception'>, <class 'AttributeError'>, AttributeError('name'))
[<function my_enum.is_natural at 0xb78a1fa4>, <function my_enum.is_negative at 0xb78ae854>, <my_enum.M_ONE: -1>, <my_enum.ZERO: 0>, <my_enum.ONE: 1>, <my_enum.TWO: 2>, <my_enum.THREE: 3>]
Run Code Online (Sandbox Code Playgroud)

那么我们有什么:

  • dir提供不完整数据
  • inspect.getmembers提供不完整的数据并提供无法访问的内部密钥getattr()
  • __dict__.keys()提供完整可靠的结果

为什么投票结果如此错误?我哪里错了?其他人的答案得票这么低,哪里错了?


Par*_*own 7

Try print(help(ClassName)) It 打印出类的方法


Jos*_*ndo 6

这也有效:

mymodule.py

def foo(x):
   return 'foo'
def bar():
   return 'bar'
Run Code Online (Sandbox Code Playgroud)

在另一个文件中:

import inspect
import mymodule
method_list = [ func[0] for func in inspect.getmembers(mymodule, predicate=inspect.isroutine) if callable(getattr(mymodule, func[0])) ]
Run Code Online (Sandbox Code Playgroud)

输出:

['富','酒吧']

来自 Python 文档:

inspect.isroutine(object)
Run Code Online (Sandbox Code Playgroud)

如果对象是用户定义的或内置的函数或方法,则返回 true。


mar*_*xor 5

如果您的方法是“常规”方法而不是staticmethod,classmethod等等。
我想出了一个小技巧-

for k, v in your_class.__dict__.items():
    if "function" in str(v):
        print(k)
Run Code Online (Sandbox Code Playgroud)

这可以通过相应地改变if条件中的“功能”来扩展到其他类型的方法。
在 Python 2.7 和 Python 3.5 中测试。

  • `if isinstance(v, types.FunctionTypes)` 会更干净。您还可以扩展它来检查“classmethod”和“staticmethod”类型的属性。 (4认同)
  • 不知道为什么这被否决了......它确实解决了我遇到的问题。 (3认同)

Jul*_*lva 5

有这样的方法:

\n
[getattr(obj, m) for m in dir(obj) if not m.startswith(\'__\')]\n
Run Code Online (Sandbox Code Playgroud)\n

在处理类实例时,也许最好返回一个包含方法引用的列表,而不仅仅是名称\xc2\xb9。如果这是您的目标,以及

\n
    \n
  1. 使用不import
  2. \n
  3. __init__从列表中排除私有方法(例如)
  4. \n
\n

它可能有用。您可能还想确保它的callable(getattr(obj, m)),因为dir返回 中的所有属性obj,而不仅仅是方法。

\n

简而言之,对于像这样的类

\n
class Ghost:\n    def boo(self, who):\n        return f\'Who you gonna call? {who}\'\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以检查实例检索

\n
>>> g = Ghost()\n>>> methods = [getattr(g, m) for m in dir(g) if not m.startswith(\'__\')]\n>>> print(methods)\n[<bound method Ghost.boo of <__main__.Ghost object at ...>>]\n
Run Code Online (Sandbox Code Playgroud)\n

所以你可以立即调用它:

\n
>>> g = Ghost()\n>>> methods = [getattr(g, m) for m in dir(g) if not m.startswith(\'__\')]\n>>> print(methods)\n[<bound method Ghost.boo of <__main__.Ghost object at ...>>]\n
Run Code Online (Sandbox Code Playgroud)\n

\xc2\xb9 一个用例:

\n

我用它来进行单元测试。有一个类,其中所有方法都执行相同过程的变体 - 这导致了冗长的测试,每个方法都与其他方法略有不同。DRY是一个遥远的梦想。

\n

我认为我应该对所有方法进行一次测试,所以我进行了上述迭代。

\n

尽管我意识到我应该重构代码本身以使其符合 DRY 标准……这可能仍然会在未来服务于随机挑剔的灵魂。

\n


归档时间:

查看次数:

310158 次

最近记录:

6 年,4 月 前