gpt4 book ai didi

Python 子类跟踪 - 元类与内置类

转载 作者:行者123 更新时间:2023-12-01 06:02:26 25 4
gpt4 key购买 nike

对于 Django 选项卡库,我创建了一个使用标记子类跟踪的架构。

为此,我创建了一个基类,然后从中派生所有选项卡类。我使用递归使用 cls.__subclasses__() 方法的函数来跟踪后代类。

为了知道哪些子类是叶类/真正的选项卡,我选择通过将 __tab__ = True 添加到我想要显示为选项卡的任何类来手动执行此操作。原因是我正在 TabView 下面创建其他抽象类,这些类不应显示为选项卡。也许这可以重写为装饰器。

示例:

def get_descendants(cls):
"""Returns all subclasses for cls, and their sublasses, and so on..."""
descendants = []
subclasses = cls.__subclasses__()
for subclass in subclasses:
descendants.append(subclass)
descendants += get_descendants(subclass)
return descendants

def TabView(object):
def _tab_group_members(self):
descendants = get_descendants(TabView)
return [d for d in descendants if '__tab__' in d.__dict__]
(...)

def ConcreteTab(TabView):
__tab__ = True

现在我开始阅读 Marty Alchin 的《Pro Django》一书。在那里,他建议使用元类来跟踪子类:

class SubclassTracker(type):
def __init__(cls, name, bases, attrs):
try:
if TrackedClass not in bases:
return
except NameError:
return
TrackedClass._registry.append(cls)

class TrackedClass(object):
__metaclass__ = SubclassTracker
_registry = []

元类方法有哪些优点?它比使用 __subclasses__() 更好吗?

最佳答案

使用元类意味着您存储在类本身内部的所有信息。这也意味着信息在创建类时存储,而不是事后扫描所有类。这意味着您只需担心创建类 - 它们会被自动跟踪。

关于Python 子类跟踪 - 元类与内置类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9631050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com