ValueObject implementation in Python

I searched for Value object implementation in Python, and found keleshev's implementation in github. But it doesn't provide the feature of immutability of Value object. So, I implemented property based immutable Value object class by myself.

Any feedbacks are welcome.

ValueObject class

class ValueObject(object):
    """ base class for Value Objects

    please call _set_properties in constructor.
    """

    def __new__(class_, *args, **kwargs):
        self = object.__new__(class_, *args, **kwargs)
        self.__initialized = False
        self.__params = dict()
        return self

    def _set_properties(self, mapping):
        if self.__initialized:
            raise AttributeError('callable only by constructor')

        self.__initialized = True
        self.__params = dict(mapping)
        self.__labels = [k for k, v in mapping]

        def setprop(key):
            setattr(self.__class__, key, property(lambda x: x.__params[key]))

        for k, v in mapping:
            if not hasattr(self.__class__, k):
                setprop(k)

    def get_values(self):
        return self.__params

    def __repr__(self):
        return unicode(self).encode('utf-8')

    def __unicode__(self):
        return u'%s(%s)' % (
            self.__class__.__name__,
            u', '.join(unicode(self.__params[k]) for k in self.__labels))

    def __hash__(self):
        return hash(repr(self))

    def __eq__(self, other):
        if not isinstance(other, self.__class__):
            return False
        return repr(self) == repr(other)

    def __ne__(self, other):
        if not isinstance(other, self.__class__):
            return True
        return repr(self) != repr(other)

Test

# -*- coding: utf-8 -*-
import pytest

from . import ValueObject


class Date(ValueObject):

    def __init__(self, year, month, day):
        self._set_properties([
            ('year', int(year)),
            ('month', int(month)),
            ('day', int(day)),
        ])


class Foo(ValueObject):
    def __init__(self, text='foo'):
        self._set_properties([
            ('text', text),
        ])


@pytest.fixture
def date():
    return Date(2012, 2, 20)


@pytest.fixture
def foo_unicode():

return Foo (u'hu')

def test_properties(date):
    assert date.year == 2012
    assert date.month == 2
    assert date.day == 20


def test_immutable(date):
    with pytest.raises(AttributeError):
        date.year = 2015


def test_set_properties(date):
    with pytest.raises(AttributeError):
        date._set_properties([
            ('year', 2015),
        ])


def test_repr(date):
    assert repr(date) == "Date(2012, 2, 20)"


def test_get_values(date):
    date.get_values == {'year': 2012, 'month': 2, 'day': 20}


def test_unicode(foo_unicode):

assert foo_unicode.text == u'huh' assert unicode (foo_unicode) == u "Foo" assert repr (foo_unicode) == u "Foo" .encode ('utf-8')

Domain Driven Development Series

Recommended Posts

ValueObject implementation in Python
RNN implementation in python
SVM implementation in python
Neural network implementation in python
Implementation of quicksort in Python
Sorting algorithm and implementation in Python
HMM parameter estimation implementation in python
Mixed normal distribution implementation in python
Implementation of life game in Python
Implementation of original sorting in Python
Quadtree in Python --2
Python in optimization
CURL in python
Metaprogramming in Python
Python 3.3 in Anaconda
Geocoding in python
SendKeys in Python
Meta-analysis in Python
Unittest in python
Epoch in Python
Discord in Python
Sudoku in Python
DCI in Python
quicksort in python
nCr in python
N-Gram in Python
Programming in python
Plink in Python
Constant in python
Lifegame in Python.
FizzBuzz in Python
Sqlite in python
StepAIC in Python
N-gram in python
LINE-Bot [0] in Python
Csv in python
Disassemble in Python
Reflection in Python
Constant in python
nCr in Python.
format in python
Scons in Python3
Puyo Puyo in python
python in virtualenv
PPAP in Python
Quad-tree in Python
Reflection in Python
Chemistry in Python
Hashable in python
DirectLiNGAM in Python
LiNGAM in Python
Flatten in python
flatten in python
Implementation module "deque" in queue and Python
Sorted list in Python
Clustering text in Python
Daily AtCoder # 2 in Python
Implement Enigma in python
Daily AtCoder # 6 in Python
Daily AtCoder # 18 in Python
Edit fonts in Python