Skip to content

Instantly share code, notes, and snippets.

@ihfazhillah
Last active April 30, 2016 14:30
Show Gist options
  • Save ihfazhillah/79e0c14f193ad39bcd860b85d5049eef to your computer and use it in GitHub Desktop.
Save ihfazhillah/79e0c14f193ad39bcd860b85d5049eef to your computer and use it in GitHub Desktop.
Bermain main dengan return self
import unittest
class Aritmatik(object):
"""Aritmatik sederhana.
Penggunaan:
Buat instance dahulu dari objek Aritmatik, mempunyai value
optional berupa *initial_int* bila anda tidak berikan maka
default adalah 0
>>> aritmatik = Aritmatik(100)
Misalkan, kita ingin mengerjakan:
(100 + 3 - 10) * 2 : 1
cara pengerjaan:
>>> aritmatik.tambah(3).kurang(10).kali(2).bagi(1)
penjelasan:
Kita tidak perlu memberikan angka 100, karena kita sudah inisiasi
diawal.
"""
def __init__(self, initial_int=0):
self.initial_int = initial_int
self.result = initial_int
def __repr__(self):
return str(self.result)
def __add__(self, num):
return self.result + num
def __mul__(self, num):
return self.result * num
def __sub__(self, num):
return self.result - num
def __truediv__(self, num):
# pakai __div__ akan mereturn error unsupported opperand
# maka disarankan untuk menggunakan __truediv__
# http://stackoverflow.com/questions/22948699/typeerror-unsupported-operand-types-for-instance-and-instance-and-tr
return self.result / num
def tambah(self, num):
self.result += num
return self
def kali(self, num):
self.result *= num
return self
def kurang(self, num):
self.result -= num
return self
def bagi(self, num):
self.result //= num # -=> mereturn tanpa koma
return self
class AritmatikTestCase(unittest.TestCase):
def setUp(self):
self.iseng = Aritmatik(12)
def tearDown(self):
pass
def test_initial_int_is_12(self):
self.assertEqual(self.iseng.initial_int, 12)
def test_result_is_12(self):
self.assertEqual(self.iseng.result, 12)
def test_add_8_is_20(self):
result = self.iseng.tambah(8)
self.assertEqual(str(result), str(20))
def test_add_then_multiply(self):
result = self.iseng.tambah(8).kali(2)
self.assertEqual(str(result), str(40))
def test_tambah_kemudian_kurang(self):
result = self.iseng.tambah(4).kurang(5)
self.assertEqual(str(result), str(11))
def test_tambah_kemudian_bagi(self):
result = self.iseng.tambah(4).bagi(8)
self.assertEqual(str(result), str(2))
def test_kurang_kemudian_tambah(self):
result = self.iseng.kurang(2).tambah(5)
self.assertEqual(str(result), str(15))
def test_kurang_kemudian_kali(self):
result = self.iseng.kurang(2).kali(50)
self.assertEqual(str(result), str(500))
def test_kurang_kemudian_kurang(self):
result = self.iseng.kurang(10).kurang(2)
self.assertEqual(str(result), str(0))
def test_kurang_kemudian_bagi(self):
result = self.iseng.kurang(2).bagi(2)
self.assertEqual(str(result), str(5))
def test_kali_kemudian_tambah(self):
result = self.iseng.kali(2).tambah(6)
self.assertEqual(str(result), str(30))
def test_hasil_ditambah_dengan_operator_tambah(self):
result = self.iseng.kali(1) + 2
self.assertEqual(result, 14)
def test_hasil_dikali_dengan_operator_kali(self):
result = self.iseng.kurang(10) * 2
self.assertEqual(result, 4)
def test_hasil_dikurang_dengan_operator_kurang(self):
result = self.iseng.bagi(6) - 1
self.assertEqual(result, 1)
def test_hasil_dibagi_dengan_operator_bagi(self):
result = self.iseng.bagi(4) / 2
self.assertEqual(result, 1.5)
# === shortcut ===
aritmatik = Aritmatik()
if __name__ == "__main__":
a1 = aritmatik
a2 = aritmatik
print(a1.tambah(3) == a2.tambah(3)) #ini return true
print("aritmatik mempunyai initial 0 "
"Kemudian untuk menambahkan dengan dua "
"maka menggunakan aritmatik.tambah(2) ")
print()
print("{initial} + {tambahan} = {hasil}".format(
initial=aritmatik,
tambahan=2,
hasil=aritmatik.tambah(2)))
unittest.main()
@ihfazhillah
Copy link
Author

import unittest


class Aritmatik(object):
    """Aritmatik sederhana.
    Penggunaan:

    Buat instance dahulu dari objek Aritmatik, mempunyai value
    optional berupa *initial_int* bila anda tidak berikan maka
    default adalah 0
    >>> aritmatik = Aritmatik(100)

    Misalkan, kita ingin mengerjakan:
    (100 + 3 - 10) * 2 : 1
    cara pengerjaan:
    >>> aritmatik.tambah(3).kurang(10).kali(2).bagi(1)

    penjelasan:
    Kita tidak perlu memberikan angka 100, karena kita sudah inisiasi
    diawal.

    """
    def __init__(self, initial_int=0):
        self.initial_int = initial_int
        self.result = initial_int

    def __repr__(self):
        return str(self.result)

    def __add__(self, num):
        return self.result + num

    def __mul__(self, num):
        return self.result * num

    def __sub__(self, num):
        return self.result - num

    def __truediv__(self, num):
        # pakai __div__ akan mereturn error unsupported opperand
        # maka disarankan untuk menggunakan __truediv__
        # http://stackoverflow.com/questions/22948699/typeerror-unsupported-operand-types-for-instance-and-instance-and-tr
        return self.result / num

    def _copy(self):
        import copy
        return copy.deepcopy(self)

    def tambah(self, num):
        a = self._copy()
        a.result += num
        return a

    def kali(self, num):
        a = self._copy()
        a.result *= num
        return a

    def kurang(self, num):
        a = self._copy()
        a.result -= num
        return a

    def bagi(self, num):
        a = self._copy()
        a.result //= num
        return a


class AritmatikTestCase(unittest.TestCase):
    def setUp(self):
        self.iseng = Aritmatik(12)

    def tearDown(self):
        pass

    def test_initial_int_is_12(self):
        self.assertEqual(self.iseng.initial_int, 12)

    def test_result_is_12(self):
        self.assertEqual(self.iseng.result, 12)

    def test_add_8_is_20(self):
        result = self.iseng.tambah(8)
        self.assertEqual(str(result), str(20))

    def test_add_then_multiply(self):
        result = self.iseng.tambah(8).kali(2)
        self.assertEqual(str(result), str(40))

    def test_tambah_kemudian_kurang(self):
        result = self.iseng.tambah(4).kurang(5)
        self.assertEqual(str(result), str(11))

    def test_tambah_kemudian_bagi(self):
        result = self.iseng.tambah(4).bagi(8)
        self.assertEqual(str(result), str(2))

    def test_kurang_kemudian_tambah(self):
        result = self.iseng.kurang(2).tambah(5)
        self.assertEqual(str(result), str(15))

    def test_kurang_kemudian_kali(self):
        result = self.iseng.kurang(2).kali(50)
        self.assertEqual(str(result), str(500))

    def test_kurang_kemudian_kurang(self):
        result = self.iseng.kurang(10).kurang(2)
        self.assertEqual(str(result), str(0))

    def test_kurang_kemudian_bagi(self):
        result = self.iseng.kurang(2).bagi(2)
        self.assertEqual(str(result), str(5))

    def test_kali_kemudian_tambah(self):
        result = self.iseng.kali(2).tambah(6)
        self.assertEqual(str(result), str(30))

    def test_hasil_ditambah_dengan_operator_tambah(self):
        result = self.iseng.kali(1) + 2
        self.assertEqual(result, 14)

    def test_hasil_dikali_dengan_operator_kali(self):
        result = self.iseng.kurang(10) * 2
        self.assertEqual(result, 4)

    def test_hasil_dikurang_dengan_operator_kurang(self):
        result = self.iseng.bagi(6) - 1
        self.assertEqual(result, 1)

    def test_hasil_dibagi_dengan_operator_bagi(self):
        result = self.iseng.bagi(4) / 2
        self.assertEqual(result, 1.5)

# === shortcut ===
aritmatik = Aritmatik()

if __name__ == "__main__":
    a1 = aritmatik
    a2 = aritmatik
    print(a1.tambah(3) == a2.tambah(3))  # ini return false
    print("aritmatik mempunyai initial 0 "
          "Kemudian untuk menambahkan dengan dua "
          "maka menggunakan aritmatik.tambah(2) ")
    print()
    print("{initial} + {tambahan} = {hasil}".format(
        initial=aritmatik,
        tambahan=2,
        hasil=aritmatik.tambah(2)))
    unittest.main()

perbedaan antara kode ini dengan kode diatas adalah mereturn copian dari dirinya sendiri, bukan return self. bisa dilihat perubahaannya di misalnya

def tambah(self, num):
        self.result += num
        return self

dengan

def tambah(self, num):
        a = self._copy()
        a.result += num
        return a

adapun self._copy() isinya adalah return copy.deepcopy(self) yakni salinannya dari dirinya sendiri

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment