【问题标题】:How to add attribute to python *class* that is _not_ inherited?如何将属性添加到_not_继承的python *class*?
【发布时间】:2015-06-19 18:46:38
【问题描述】:

我需要能够在子类不可见的不是类的实例上)上设置一个标志。问题是,有没有可能,如果有,我该怎么做?

为了说明,我想要这样的东西:

class Master(SomeOtherClass):
    __flag__ = True

class Child(Master):
    pass

... 其中hasattr(Master, "__flag__") 应该为Master 返回TrueFalseChild。这可能吗?如果是这样,怎么做?我不想在每个孩子中都明确地将 __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

【问题讨论】:

  • 你可以设为__hidden,那么只有直接定义它的类才有_ClassName__hidden属性。
  • 有什么理由不想写cls.__dict__.get('__hidden__'),除了它很丑吗?
  • @jonrsharpe:不,我没有想到这个解决方案。这将非常有效。写一个答案,如果你愿意,我可以接受。如果您不这样做,我将自己添加答案以供将来参考。谢谢!

标签: python decorator


【解决方案1】:

你们很亲密:

class Master(SomeOtherClass):
    __flag = True

class Child(Master):
    pass

两个前导下划线没有尾随下划线调用name mangling,因此属性将命名为_Master__flag。因此,如果您检查:

hasattr(cls, '_{}__flag'.format(cls.__name__))

对于Master,它将True,而不是Child

【讨论】:

  • 这不是我要找的——我没有类的实例,我只有类。不过,这项技术的工作原理是一样的。
  • @BryanOakley 是的,课程也是如此;相应更新!
猜你喜欢
  • 2023-02-13
  • 2014-11-04
  • 2020-12-11
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多