我需要能够在类(不在类的实例上)上设置一个对子类不可见的标志.问题是,它是否可能,如果是这样,我该怎么做?
为了说明,我想要这样的事情:
class Master(SomeOtherClass):
__flag__ = True
class Child(Master):
pass
Run Code Online (Sandbox Code Playgroud)
...其中hasattr(Master, "__flag__")应该返回True了Master,但False对Child.这可能吗?如果是这样,怎么样?我不想__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)
你非常接近:
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)
它只能是True对Master,没有Child.