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)}")

这个方案通过自定义元类,在类创建时捕获类命名空间中的字段顺序。关键点在于:

  1. 元类的__new__方法能访问类定义时的原始命名空间
  2. 过滤掉魔术方法和继承的字段,只保留用户定义的类属性
  3. 将顺序信息存储为类的__field_order__属性

这样就能准确获取类定义时字段的声明顺序,而不是字典遍历时的随机顺序。

你用 dict 还指望有序呢。。

是啊,当时傻 X 了。。

回到顶部