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"的实例(或者是在线下的子项).
(如何)这可以实现最简单?通过这种方式添加更多子类需要最少量的工作/更改?
您可以使用 isinstance 来确保您只获得类实例
在您的代码中,只有一行更改:
class IterPartRegistry(type):
def __iter__(cls):
return (c for c in cls._registry if isinstance(c, cls))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
222 次 |
最近记录: |