我有一個類定義了'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)