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)
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)
Eug*_*kin 27
试试这家酒店__dict__.
Nar*_*shi 25
假设您想知道与列表类关联的所有方法Just Type以下内容
print (dir(list))
Run Code Online (Sandbox Code Playgroud)
上面将为您提供列表类的所有方法
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)
小智 16
您可以使用以下代码列出 python 类中的所有方法
dir(className)
Run Code Online (Sandbox Code Playgroud)
这将返回类中所有方法名称的列表
sat*_*aha 12
请注意,您需要考虑是否需要结果中包含的继承(但未覆盖)的基类方法.在dir()和inspect.getmembers()操作做包括基类的方法,但使用的__dict__属性没有.
我只是将其保留在那里,因为评分最高的答案尚不清楚。
这是一个简单的测试,具有基于枚举的非常规类。
# -*- 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()提供完整可靠的结果为什么投票结果如此错误?我哪里错了?其他人的答案得票这么低,哪里错了?
这也有效:
在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。
如果您的方法是“常规”方法而不是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 中测试。
有这样的方法:
\n[getattr(obj, m) for m in dir(obj) if not m.startswith(\'__\')]\nRun Code Online (Sandbox Code Playgroud)\n在处理类实例时,也许最好返回一个包含方法引用的列表,而不仅仅是名称\xc2\xb9。如果这是您的目标,以及
\nimport__init__从列表中排除私有方法(例如)它可能有用。您可能还想确保它的callable(getattr(obj, m)),因为dir返回 中的所有属性obj,而不仅仅是方法。
简而言之,对于像这样的类
\nclass Ghost:\n def boo(self, who):\n return f\'Who you gonna call? {who}\'\nRun 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 ...>>]\nRun 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 ...>>]\nRun Code Online (Sandbox Code Playgroud)\n\xc2\xb9 一个用例:
\n我用它来进行单元测试。有一个类,其中所有方法都执行相同过程的变体 - 这导致了冗长的测试,每个方法都与其他方法略有不同。DRY是一个遥远的梦想。
\n我认为我应该对所有方法进行一次测试,所以我进行了上述迭代。
\n尽管我意识到我应该重构代码本身以使其符合 DRY 标准……这可能仍然会在未来服务于随机挑剔的灵魂。
\n| 归档时间: |
|
| 查看次数: |
310158 次 |
| 最近记录: |