静态属性,仅在具体类中为True,在Python中为其子级为False
作者:互联网
问题
假设我有一个Root类,并且想访问(例如初始化)其所有子类.但是,有些子类需要以编程方式忽略.
例
class Root(object):
pass
class Parent(Root):
ignore_me = True
class Child(Parent):
pass
def get_subclasses(klass):
result = klass.__subclasses__()
for subclass in result:
result += get_subclasses(subclass)
return result
subs = [sub for sub in get_subclasses(Root) if not sub.ignore_me]
所以我在这里想要的是,子类列表中包括子类,而不是父类.
平凡的解决方案
当然,我可以为每个子类定义ignore_me属性,但要点是我想将子类与该细节隔离开,以便他们甚至都不会意识到.
题
如何仅通过在Parent类中定义ignore_me属性来实现目标?
解决方法:
您可以使用if sub .__ dict __.get(‘ignore_me’,False)来检查ignore_me属性是否直接出现在给定的子类中(未继承).
但是,您仍然需要以不同的方式执行此操作,因为__subclasses__仅返回直接子类(如documented).如果要遍历所有后代类,则需要编写一些代码来递归调用层次结构中每个类的__subclasses__.像这样:
def getSubs(cls):
for sub in cls.__subclasses__():
if not sub.__dict__.get('ignore_me', False):
yield sub
for desc in getSubs(sub):
yield desc
然后:
>>> list(getSubs(Root))
[<class '__main__.Child'>]
标签:oop,python-2-x,python,design-patterns 来源: https://codeday.me/bug/20191028/1951783.html