python - 如何向 _not_ 继承的 python *class* 添加属性?

标签 python decorator

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

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

class Master(SomeOtherClass):
    __flag__ = True

class Child(Master):
    pass

... 其中 hasattr(Master, "__flag__") 应该为 Master 返回 TrueFalse child 。这可能吗?如果是这样,如何?我不想在每个 child 中都将 __flag__ 显式设置为 false。

我最初的想法是定义 __metaclass__,但我没有那么多奢侈,因为 Master 继承自一些我无法控制的其他类和元类哪些是私有(private)的。

最终我想写一个装饰器,这样我就可以做类似的事情:

@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

最佳答案

你们非常亲密:

class Master(SomeOtherClass):
    __flag = True

class Child(Master):
    pass

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

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

对于 Master,它只有True,而不是Child

关于python - 如何向 _not_ 继承的 python *class* 添加属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945244/

相关文章:

python 内存问题

python - 如何使用 SparseVector 功能构建模式?

python - 有没有办法在 Python 中对函数的每一行进行修饰/执行操作?

javascript - “this”在 TypeScript 属性装饰器中未定义

python - 类型错误 : geturl() takes exactly 1 argument (2 given)

Python匿名管道设置超时

python - Numpy "orthogonal"广播

python - 在python中装饰递归函数

java - 类层次结构爆炸

c# - 具有继承和组合的装饰器模式