У меня есть класс, который определяет «будильник», а затем один определяет «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.
Таким образом, вместо свойства экземпляра, я установил класс сигнализации использовать свойство класса:
class alarm(object):
severity = 'Warning'
name = None
eventId = None
, а затем снова не меняются на httpalarm я проверил еще раз;
c = httpalarm(test='Test')
vars(c)
->
{'test': 'Test'}
Опять же, варны не показывают все другие свойства. Однако они устанавливаются как;
print c.severity
'Warning'
Печать унаследованного имущества, похоже, сработала. А также с помощью реж (с), чтобы показать объект действительно возвращает все свойства
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 d включает все свойства от тревоги, а также свойство от своего класса httpalarm.
Edit: После подачи от Корли 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)