Python:uu子类

2024-10-03 06:18:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码通过调用基类上的__subclasses__()函数来创建子类的(实例)列表。在

subclasses = [subclass() for subsclass in BaseClass.__subclasses__()]

在Python2.7中,这个列表中的子类的顺序始终等于我的代码中import语句的顺序(每个子类都在它自己的Python文件中定义)。但是在Python3.5中,这个列表中的子类的顺序似乎是随机的。在python3.5中,我可以使用某种变通方法来获得相同的行为吗?在

参见^{} documentation。在


Tags: 实例函数代码inimport列表for顺序
1条回答
网友
1楼 · 发布于 2024-10-03 06:18:32

在python3.5中,没有,不是通过任何简单的方法。As of Python 3.4tp_subclasses数据结构通过字典跟踪子类(将子类的id()值映射到弱引用,请参见Python issue #17936了解原因)。字典是无序的。在

在Python3.6中,字典的内部实现发生了变化,现在它们跟踪插入顺序。当您升级到python3.6时,您将再次按照插入顺序(Python第一次看到它们的顺序)获得子类。在

然而,子类在字典中被跟踪的事实是实现细节,不应该真正依赖它。在

你可以用其他方法跟踪订单。可以给基类一个按顺序记录子类的元类,例如:

from itertools import count
from weakref import WeakKeyDictionary

class SubclassesInOrderMeta(type):
    _subclass_order = WeakKeyDictionary()
    _counter = count()

    def __ordered_subclasses__(cls):
        # sort subclasses by their 'seen' order; the sort key
        # puts classes that are missing from the _subclass_order
        # mapping at the end, defensively.
        order_get = type(cls)._subclass_order.get
        sort_key = lambda c: order_get(c, float('inf'))
        return sorted(cls.__subclasses__(), key=sort_key)

    def __new__(mcls, *args, **kwargs):
        cls = super(SubclassesInOrderMeta, mcls).__new__(mcls, *args, **kwargs)
        mcls._subclass_order[cls] = next(mcls._counter)
        return cls

相关问题 更多 >