zjowowen's picture
init space
079c32c
from typing import Type
from .base import _LOGGED_VALUE__PROPERTY_NAME, _LOGGED_MODEL__PROPERTY_ATTR_PREFIX, _ValueType
from .data import TimeRangedData
class LoggedValue:
"""
Overview:
LoggedValue can be used as property in LoggedModel, for it has __get__ and __set__ method.
This class's instances will be associated with their owner LoggedModel instance, all the LoggedValue
of one LoggedModel will shared the only one time object (defined in time_ctl), so that timeline can
be managed properly.
Interfaces:
``__init__``, ``__get__``, ``__set__``
Properties:
- __property_name (:obj:`str`): The name of the property.
"""
def __init__(self, type_: Type[_ValueType] = object):
"""
Overview:
Initialize the LoggedValue object.
Interfaces:
``__init__``
"""
self.__type = type_
@property
def __property_name(self):
"""
Overview:
Get the name of the property.
"""
return getattr(self, _LOGGED_VALUE__PROPERTY_NAME)
def __get_ranged_data(self, instance) -> TimeRangedData:
"""
Overview:
Get the ranged data.
Interfaces:
``__get_ranged_data``
"""
return getattr(instance, _LOGGED_MODEL__PROPERTY_ATTR_PREFIX + self.__property_name)
def __get__(self, instance, owner):
"""
Overview:
Get the value.
Arguments:
- instance (:obj:`LoggedModel`): The owner LoggedModel instance.
- owner (:obj:`type`): The owner class.
"""
return self.__get_ranged_data(instance).current()
def __set__(self, instance, value: _ValueType):
"""
Overview:
Set the value.
Arguments:
- instance (:obj:`LoggedModel`): The owner LoggedModel instance.
- value (:obj:`_ValueType`): The value to set.
"""
if isinstance(value, self.__type):
return self.__get_ranged_data(instance).append(value)
else:
raise TypeError(
'New value should be {expect}, but {actual} found.'.format(
expect=self.__type.__name__,
actual=type(value).__name__,
)
)