如何将属性添加到_not_ inherited的python*class*?

Bry*_*ley 8 python decorator

我需要能够在(不在的实例上)上设置一个对子类不可见的标志.问题是,它是否可能,如果是这样,我该怎么做?

为了说明,我想要这样的事情:

class Master(SomeOtherClass):
    __flag__ = True

class Child(Master):
    pass
Run Code Online (Sandbox Code Playgroud)

...其中hasattr(Master, "__flag__")应该返回TrueMaster,但FalseChild.这可能吗?如果是这样,怎么样?我不想__flag__在每个孩子中明确地设置为false.

我最初的想法是定义__metaclass__,但我没有这样做的奢侈,因为Master继承自其他一些我无法控制的类和元类以及哪些是私有的.

最后我想写一个装饰器,这样我就可以这样做:

@hide_this
class Master(SomeOtherClass): pass

@hide_this
class Child(Master): pass

class GrandChild(Child): pass
...
for cls in (Master, Child, GrandChild)
    if cls.__hidden__:
        # Master, Child
    else:
        # GrandChild
Run Code Online (Sandbox Code Playgroud)

jon*_*rpe 5

你非常接近:

class Master(SomeOtherClass):
    __flag = True

class Child(Master):
    pass
Run Code Online (Sandbox Code Playgroud)

没有尾随下划线的两个前导下划线调用名称修改,因此将命名该属性_Master__flag.因此,如果您检查:

hasattr(cls, '_{}__flag'.format(cls.__name__))
Run Code Online (Sandbox Code Playgroud)

只能TrueMaster,没有Child.