Source code for pyleecan.Classes.frozen
# -*- coding: utf-8 -*-
from numpy import array_equal, ndarray
[docs]class FrozenClass(object):
"""A FrozenClass is designed to avoid adding or accessing wrong properties
For instance w.wire instead of w.Wwire will throw a Frozen Error
"""
__isfrozen = False # Current state
def __setattr__(self, key, value):
"""Overide to avoid the add of new properties outside of __init__
Parameters
----------
self : FrozenClass
The class to set
key : str
The name of the property to set
value : ?
The value to set
Raises
------
FrozenError
You can't set a new property if the class is frozen
"""
# You can't add a new property to a frozen object
if self.__isfrozen and not hasattr(self, key):
raise FrozenError(
self.__class__.__name__ + ' class has no "' + key + '" ' "property"
)
object.__setattr__(self, key, value)
def _freeze(self):
"""After the call of this function, you can't add new properties to
this FrozenClass
Parameters
----------
self : FrozenClass
The FrozenClass object to freeze
Returns
-------
None
"""
self.__isfrozen = True
def __eq__(self, other):
"""Two FrozenClass instance are equal if they have the same __dict__
Parameters
----------
self : FrozenClass
A FrozenClass object
other: FrozenClass
Another FrozenClass object
Returns
-------
is_equal: bool
True if self == other
"""
if isinstance(other, self.__class__):
for attr in self.__dict__:
if isinstance(self.__dict__[attr], ndarray):
if not array_equal(self.__dict__[attr], other.__dict__[attr]):
return False
else:
if self.__dict__[attr] != other.__dict__[attr]:
return False
return True
else:
return False
def __ne__(self, other):
"""Call __eq__
Parameters
----------
self : FrozenClass
A FrozenClass object
other: FrozenClass
Another FrozenClass object
Returns
-------
is_not_equal: bool
True if self != other
"""
return not self.__eq__(other)
[docs]class FrozenError(Exception):
"""Throw when the class is frozen and a new property is set
"""
pass