应直接遍历cls.__dict__.items()并结合inspect.isfunction、staticmethod、classmethod判断,才能准确获取当前类显式定义的方法名,排除继承、特殊方法及动态添加项。

直接用 dir() 会混入大量内置方法和继承来的属性
dir() 返回的是对象的**所有可访问名称**,包括从父类继承的方法、特殊方法(如 __init__、__str__)、类变量、甚至模块导入的符号。它不区分“定义在当前类中”还是“从别处来”。比如:
class A:
def foo(self): pass
def bar(self): pass
<p>class B(A):
def baz(self): pass</p>
对 B 调用 dir(B),你会看到 foo、bar、baz,但还有 __dict__、__module__、__weakref__ 等几十个无关项。这不是“当前类定义的方法列表”,只是“能通过点号访问的所有名字”。
用 inspect.getmembers() + inspect.isfunction 还是不够准
很多人试过这样过滤:
import inspect methods = [name for name, obj in inspect.getmembers(cls, inspect.isfunction)]
问题在于:inspect.isfunction 只识别纯函数对象,而 Python 类中定义的普通方法在类体里确实是函数,但一旦绑定到类,就变成 function 对象;不过在 Python 3.10+ 中,@staticmethod 和 @classmethod 会被包装成对应描述符对象,inspect.isfunction 就漏掉了它们。更关键的是——它依然包含父类定义的方法。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
正确做法是结合 inspect.getmembers() 和 inspect.isfunction / inspect.ismethod,再限定只看 cls.__dict__:
- 只遍历
cls.__dict__.items(),确保是当前类**直接定义**的成员 - 对每个值用
inspect.isfunction(obj)或inspect.ismethod(obj)判断(其实ismethod在类字典里基本不会为真,因为未绑定) - 补充检查
isinstance(obj, (staticmethod, classmethod)),因为它们的底层仍是函数
推荐方案:用 inspect.getmembers() 配合 cls.__dict__ 精确提取
最稳妥的方式是绕过 dir(),直接查类自己的命名空间:
__init__
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










