使类成为可继承的

2024-09-27 01:19:49 发布

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

好吧,简单地让一个类iterable很容易使用元类(所以这里有一些其他答案)。不过,我希望使一个类成为iterable,并使之能够“基于继承迭代子组”。我的一个使用示例:

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()

第一个循环起作用-它遍历“A”的所有实例和子对象。然而,第二个循环应该只在“A”的特定子组上运行,这些子组是子“B”的实例(或更后面的子组)。在

(如何)这是最容易实现的?以这种方式添加更多的子类需要最少的工作量/更改?在


Tags: nameinselffordefpassiterableclass
2条回答

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

在您的代码中只需一行代码:

class IterPartRegistry(type):
    def __iter__(cls):
        return (c for c in cls._registry if isinstance(c, cls))

您可以让每个类维护自己的实例列表,方法是 它自己的_registry类属性。然后,不是检查每个 实例是一个特定的类,您可以迭代_registry中每个子类的cls的所有值。要找到这些子类,可以使用 ^{}方法:

import itertools as IT
class IterPartRegistry(type):
    def __init__(cls, name, bases, attrs):
        super(IterPartRegistry, cls).__init__(name, bases, attrs)
        cls._registry = []
    def __iter__(cls):
        yield from cls._registry
        for subcls in cls.__subclasses__():
            yield from subcls

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

class B(A): pass

class C(A): pass

class D(B, C): pass

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

for t in A:
    print(t.name)

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

收益率

^{pr2}$

相关问题 更多 >

    热门问题