setattr(self, k, v)
def __getattr__(self, name):
- if name not in self.__slots__:
+ if name not in self._all_slots():
raise AttributeError("Invalid object attribute %s.%s" %
(type(self).__name__, name))
return None
def __setstate__(self, state):
+ slots = self._all_slots()
for name in state:
- if name in self.__slots__:
+ if name in slots:
setattr(self, name, state[name])
+ @classmethod
+ def _all_slots(cls):
+ """Compute the list of all declared slots for a class.
+
+ """
+ slots = []
+ for parent in cls.__mro__:
+ slots.extend(getattr(parent, "__slots__", []))
+ return slots
+
def ToDict(self):
"""Convert to a dict holding only standard python types.
"""
result = {}
- for name in self.__slots__:
+ for name in self._all_slots():
value = getattr(self, name, None)
if value is not None:
result[name] = value
__slots__ attribute for this class.
"""
+ slots = self._all_slots()
for key in kwargs:
- if key not in self.__slots__:
+ if key not in slots:
raise TypeError("Object %s doesn't support the parameter '%s'" %
(self.__class__.__name__, key))
setattr(self, key, kwargs[key])
"""
state = {}
- for name in self.__slots__:
+ for name in self._all_slots():
if hasattr(self, name):
state[name] = getattr(self, name)
return state
raise ValueError("Invalid data to __setstate__: expected dict, got %s" %
type(state))
- for name in self.__slots__:
+ for name in self._all_slots():
if name not in state:
delattr(self, name)
for name in state:
setattr(self, name, state[name])
+ @classmethod
+ def _all_slots(cls):
+ """Compute the list of all declared slots for a class.
+
+ """
+ slots = []
+ for parent in cls.__mro__:
+ slots.extend(getattr(parent, "__slots__", []))
+ return slots
+
class OpCode(BaseOpCode):
"""Abstract OpCode.
dirs = []
entries = []
if isinstance(obj, objects.ConfigObject):
- for name in obj.__slots__:
+ # pylint: disable-msg=W0212
+ # yes, we're using a protected member
+ for name in obj._all_slots():
child = getattr(obj, name, None)
if isinstance(child, (list, dict, tuple, objects.ConfigObject)):
dirs.append(name)