我有一个类定义了'alarm',然后一个定义了'httpalarm'。现在httpalarm与警报共享许多相同的属性(实际上它们都具有相同的属性,以及其他属性)。对象继承父对象的属性
我认为我应该可以做的就是将这些属性定义为警报对象的一部分,然后当httpalarm被创建为警报子时,它应该已经获得所有属性。但事实并非如此。至少,似乎没有;
class alarm(object):
def __init__(self, severity, name, eventId):
self.severity = severity
self.name = name
self.eventId eventId
class httpalarm(alarm):
def __init__(self, **kwargs):
self._dict__.update(kwargs)
现在,当我创建一个报警对象我得到了我期望:
a = alarm('Critical', 'Name', '0x800111')
vars(a)
->
{'severity': 'Critical', 'name': 'Name', 'eventId': '0x800111'}
这是符合市场预期。但是,当我创建一个httpalarm:
b = httpalarm(test = 'Test')
vars(b)
->
{'test': 'Test'}
这是意想不到的。我期待httpalarm b也会设置严重性,名称和eventId属性。没有改变httpalarm我再测试一次
class alarm(object):
severity = 'Warning'
name = None
eventId = None
然后;:
因此,而不是实例的属性,我设置为使用类属性报警类别
c = httpalarm(test='Test')
vars(c)
->
{'test': 'Test'}
此外,变量不显示所有其他属性。但是,他们正在被设定为;
print c.severity
'Warning'
打印继承属性似乎工作。并且还使用dir(c)来显示对象的确会返回所有属性
dir(c)
->
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'eventId', 'name', 'severity', 'test']
我不太确定这里发生了什么。我想创建一个可以继承的警报类,以免我必须始终定义相同的属性。我想要得到的是:
d = httpalarm(severity = 'Critical', name = 'Name', eventId = '0x800111', test = 'test')
,并有httpalarm实例ð包括报警的所有属性,以及其自己的httpalarm类的属性。
编辑: 继从科利Brigman提交我有这个工作作为工作用料:
class httpalarm(alarm):
def __init__(self,
**kwargs):
super(httpalarm, self).__init__()
for k,v in self.__dict__.iteritems():
if type(v) == tuple:
setattr(self, k, v[0])
self.__dict__.update(kwargs)