Python中如何获取类定义时字段的顺序?
In [4]: class Person:
…: pass
In [5]: class Friend:
…: zhang_san=Person()
…: wang_wu=Person()
…: li_si=Person()
Friend.dict 或 dir(Friend)得到的字段列表都是按照码表正序排列的,有没有办法可以从类定义中得到静态字段定义时的顺序么,或者在静态字段定义时可以得到类的信息?即 Person 中可以得到关联的 Friend 类信息
Python中如何获取类定义时字段的顺序?
5 回复
或者静态字段如何从内部知道自己是某类的成员?
比如 zhang_san=Person()
在 Person()内,就可以得到 Friend.zhang_san 这样的信息。。
class OrderedFieldsMeta(type):
"""元类:记录类定义时字段的顺序"""
def __new__(mcs, name, bases, namespace):
# 过滤掉魔术方法和继承的字段
ordered_fields = [
key for key in namespace.keys()
if not key.startswith('__') and not key.endswith('__')
]
# 将字段顺序存入类的 __field_order__ 属性
cls = super().__new__(mcs, name, bases, namespace)
cls.__field_order__ = ordered_fields
return cls
class MyClass(metaclass=OrderedFieldsMeta):
x = 1
y = 2
z = 3
# 使用示例
print(MyClass.__field_order__) # 输出: ['x', 'y', 'z']
# 保持字段顺序的迭代
for field_name in MyClass.__field_order__:
print(f"{field_name}: {getattr(MyClass, field_name)}")
这个方案通过自定义元类,在类创建时捕获类命名空间中的字段顺序。关键点在于:
- 元类的
__new__方法能访问类定义时的原始命名空间 - 过滤掉魔术方法和继承的字段,只保留用户定义的类属性
- 将顺序信息存储为类的
__field_order__属性
这样就能准确获取类定义时字段的声明顺序,而不是字典遍历时的随机顺序。
你用 dict 还指望有序呢。。
是啊,当时傻 X 了。。

