Если вы определяете:
class baseClass:
DataMap = {
'key1': 'val1',
'key2': 'val2',
'key3': 'val2',
}
, тогда baseClass.__dict__
содержит 'DataMap': {'key3': 'val2', 'key2': 'val2', 'key1': 'val1'}
.
Это делает невозможным участие DataMap
в наследовании классов, поскольку, если вы позже определите
class subClass2(baseClass): # appends values to base DataMap
DataMap = {'key4':'val4'}
, тогда subClass2.__dict__
имеет собственную конкурирующую запись с ключом 'DataMap'
.Если s = subClass2()
является экземпляром subClass2
, то s.DataMap
получит доступ только к DataMap
в subClass2.__dict__
и, найдя его, никогда не будет искать в baseClass.__dict__
.Таким образом, наследование не происходит.
Вы можете изменить baseClass.__dict__
внутри subClass2
, но это нарушит принципы ООП, поскольку дочерний класс не должен изменять своего родителя.И это в любом случае не будет наследованием, поскольку изменения в baseClass.__dict__
затронут все экземпляры baseClass
и все подклассы, которые используют его DataMap
.
Возможно, вы сможете достичь того, что ищетеподклассами DataMap
сам:
class DataMap(object):
key1='val1'
key2='val2'
key3='val2'
class subDataMap(DataMap):
key4='val4'
class baseClass(object):
dataMap=DataMap
class subClass1(baseClass):
def myfunc(self,x):
val=getattr(self.dataMap,x)
if val == 'val2':
print 'foo'
class subClass2(baseClass):
dataMap=subDataMap
def myfunc(self,x):
val=getattr(self.dataMap,x)
if val == 'val4':
print 'foo'
elif val == 'val2':
print 'bar'
s=subClass1()
s.myfunc('key2')
# foo
try:
s.myfunc('key4')
except AttributeError as err:
print(err)
# subClass1 instance has no attribute 'key4'
s2=subClass2()
s2.myfunc('key2')
# bar
s2.myfunc('key4')
# foo