Python |获取父class中所有子类的所有静态class变量

Python | Get all static-class variables of all sublcasses in parent class

我想获得我父class(在python)中所有子classes的所有class变量名。虽然我设法做到了这一点,但我不确定是否有更简洁的方法来实现它。

解释问题的伪代码:

class Parent:
    all_names = []
    var_1 = 1
    
    def __init__(self):
       print(self.all_names) 

class ChildA(Parent):
    var_2 = 2

class ChildB(ChildA):
    var_3 = 3
  
p = Parent()
ca = ChildA()
cb = ChildB()

>>> ["var_1"]
>>> ["var_1","var_2"]
>>> ["var_1","var_2","var_3"]

所以我目前正在做的是使用 __new__ 函数递归设置这些值:


class Parent(object):
    test_1 = 1

    signals = []

    def __new__(cls, *args, **kwargs):
        # create obj ref
        _obj = super().__new__(cls, *args, **kwargs)
 
        signals = []

        # walk every base and add values
        def __walk(base):
            for key, value in vars(base).items():
                if <condition>
                    signals.append(value.__name__)

            for base in base.__bases__:
                __walk(base)

        __walk(cls)

        signals.reverse() # to reorder the list

        _obj.signals = signals

        return _obj

有关更多上下文:我正在尝试开发一个信号系统,但为了检查一个实例是否有一个信号,我需要以某种方式将它们添加到 Root-Parent-Class。是的,我可以让所有 Subclasses 都继承自助手 class,但我不想这样做,而是将它们全部捆绑在尽可能少的 classes 中。

此外,如果我的实现有任何 bugs/risks,请告诉我我最近才发现 __new__

(Python 3.x)

您可以沿着方法解析顺序前进,并检查每个 class 的 __dict__ 中未出现在 object.__dict__ 中且不是可调用密钥或私钥的任何密钥。

class Parent:
    var_p = 1
    def __init__(self):
        self.blah = 0
        class_vars = []
        for cls in self.__class__.mro()[:-1]:
            class_vars.extend([
                k for k, v in cls.__dict__.items()
                if k not in object.__dict__ and not k.startswith('_')
                and not callable(v)
            ])
        print(class_vars)

    def test(self):
        return True

class ChildA(Parent):
    var_a = 2


class ChildB(ChildA):
    var_b = 3

p = Parent()
ca = ChildA()
cb = ChildB()

# prints:
['var_p']
['var_a', 'var_p']
['var_b', 'var_a', 'var_p']