Ответ Майкла приятный и простой, но если вы хотите избежать добавления этой строки в каждый подкласс Unit - возможно, у вас есть куча других списков, подобных этому, метакласс - это простой способ решения проблемы
class UnitMeta(type):
def __init__(self, *args):
super(UnitMeta, self).__init__(*args)
self.listvalue = [10]
class Unit(object):
__metaclass__ = UnitMeta
pass
class Archer(Unit):
pass
print Unit.listvalue
print Archer.listvalue
Archer.listvalue[0] = 5
print Unit.listvalue
print Archer.listvalue
выход:
[10]
[10]
[10]
[5]
Вы также можете расширить эту же идею для автоматического поиска и копирования списков (и диктов), определенных в Единице
class UnitMeta(type):
def __init__(self, *args):
super(UnitMeta, self).__init__(*args)
for superclass in self.__mro__:
for k,v in vars(superclass).items():
if isinstance(v, (list, dict, )):
setattr(self, k, type(v)(v))
class Unit(object):
__metaclass__ = UnitMeta
listvalue = [10]
class Archer(Unit):
pass