遍历Python类中的所有成员
在Python中,有几种方法可以遍历一个类的所有成员(属性和方法)。以下是几种常用的方法:
1. 使用 dir()
函数
class MyClass:
class_var = 42
def __init__(self):
self.instance_var = 10
def method1(self):
pass
@staticmethod
def static_method():
pass
@classmethod
def class_method(cls):
pass
# 遍历所有成员
for name in dir(MyClass):
print(name)
2. 使用 vars()
函数(返回类的 __dict__
)
for name, value in vars(MyClass).items():
if not name.startswith('__'): # 过滤掉特殊方法
print(f"{name}: {value}")
3. 使用 inspect
模块(更高级的检查)
import inspect
for name, member in inspect.getmembers(MyClass):
if not name.startswith('__'): # 过滤掉特殊方法
print(f"{name}: {member}")
4. 区分不同类型的成员
def print_members(cls):
print("类属性:")
for name, value in vars(cls).items():
if not name.startswith('__') and not inspect.isfunction(value) and not inspect.ismethod(value):
print(f" {name}: {value}")
print("\n方法:")
for name, value in inspect.getmembers(cls, inspect.isfunction):
print(f" {name}")
print("\n静态方法:")
for name, value in inspect.getmembers(cls, inspect.isfunction):
if isinstance(getattr(cls, name), staticmethod):
print(f" {name}")
print("\n类方法:")
for name, value in inspect.getmembers(cls, inspect.ismethod):
print(f" {name}")
print_members(MyClass)
注意事项
dir()
会返回所有可访问的成员,包括继承的成员vars()
或__dict__
只返回类自身的成员,不包括继承的成员- 这些方法也会返回一些Python内部使用的特殊成员(以
__
开头和结尾的) - 如果要遍历实例的成员,可以使用相同的方法,但结果会有所不同(实例的
__dict__
只包含实例属性)
实例成员遍历示例
obj = MyClass()
print("实例属性:")
for name, value in vars(obj).items():
print(f"{name}: {value}")
print("\n所有可访问成员:")
for name in dir(obj):
print(name)
选择哪种方法取决于你的具体需求,比如是否需要包含继承的成员,是否需要过滤掉特殊方法等。