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']
我想获得我父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']