使类可迭代尊重继承

pau*_*l23 5 python inheritance iterable metaclass

使用元类(这里有一些其他答案),简单地使类可迭代很容易.但是我希望使一个类可迭代,并且还允许一个"基于继承迭代一个子组".我使用的一个例子:

class IterPartRegistry(type):
    def __iter__(cls):
        return iter(cls._registry)


class A(object, metaclass=IterPartRegistry):
    _registry = []
    def __init__(self, name):
        self.name = name
        self._registry.append(self)

class B(A):
    pass

class C(A):
    pass


A("A - first")
B("B - first")
B("B - second")
C("C - first")

for t in A:
    print(t.name)

print(" --- ")
for t in B:
    print(t.name)

exit()
Run Code Online (Sandbox Code Playgroud)

第一个循环起作用 - 它遍历"A"的所有实例和子节点.但是,第二个循环应仅在"A"的特定子组上运行 - 那些是子项"B"的实例(或者是在线下的子项).

(如何)这可以实现最简单?通过这种方式添加更多子类需要最少量的工作/更改?

Yoa*_*ner 3

您可以使用 isinstance 来确保您只获得类实例

在您的代码中,只有一行更改:

class IterPartRegistry(type):
    def __iter__(cls):
        return (c for c in cls._registry if isinstance(c, cls))
Run Code Online (Sandbox Code Playgroud)