编程语言
首页 > 编程语言> > 静态属性,仅在具体类中为True,在Python中为其子级为False

静态属性,仅在具体类中为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