-
Notifications
You must be signed in to change notification settings - Fork 0
/
Task_1.py
154 lines (134 loc) · 4.83 KB
/
Task_1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# Создать класс дробь(Fraction), конструктор которого принимает целые числа
# (num, den - числитель(numerator), знаменатель(denominator) ).
#
# Выполнить
#
# Атрибуты числитель и знаменатель в классе сделать приватными. Доступ к
# атрибутам реализовать через свойства.
#
# Переопределить методы __sub__, __add__, __mull__, __truediv__
# для того, чтобы можно было выполнять соответствующие математические действия
# с объектами класса дробь.
# (Вычитание, сложение, умножение и деление).
#
# Добавить класс миксин, в котором реализовать статические методы, для этих же
# операций(add, sub, mull, div). Добавить класс миксин в класс Fraction
#
# Создать classmethod который из строки типа 'числитель/знаменатель' возвращает
# объект класса дробь.
#
# Переопределить метод __str__, который при выводе объекта на печать будет
# выводить строку вида num / den.
#
# Создать объекты класса дробь.
#
# Выполнить все реализованные методы.
class FractionMixin:
@staticmethod
def add(fr1, fr2):
num = fr1.num * fr2.den + fr2.num * fr1.den
den = fr1.den * fr2.den
if den % num == 0:
den = den // num
num = 1
return f'{num}/{den}'
def sub(fr1, fr2):
num = fr1.num * fr2.den - fr2.num * fr1.den
den = fr1.den * fr2.den
if den % num == 0:
den = den // num
num = 1
return f'{num}/{den}'
def mul(fr1, fr2):
num = fr1.num * fr2.num
den = fr1.den * fr2.den
if den % num == 0:
den = den // num
num = 1
return f'{num}/{den}'
def div(fr1, fr2):
num = fr1.num * fr2.den
den = fr1.den * fr2.num
if den % num == 0:
den = den // num
num = 1
if num % den == 0:
num = num // den
den = 1
return f'{num}/{den}'
class Fraction(FractionMixin):
def __init__(self, num, den):
self.num = num
self.den = den
@property
def num(self):
return self.__num
@num.setter
def num(self, num):
assert num != 0, "Numerator can't be equal 0"
self.__num = num
@property
def den(self):
return self.__den
@den.setter
def den(self, den):
assert den != 0, "Denominator can't be equal 0"
self.__den = den
def __add__(self, other):
num = self.num * other.__den + other.__num * self.den
den = self.den * other.__den
if den % num == 0:
den = den // num
num = 1
return self.__class__(num, den)
def __sub__(self, other):
num = self.num * other.__den - other.__num * self.den
den = self.den * other.__den
if den % num == 0:
den = den // num
num = 1
return self.__class__(num, den)
def __mul__(self, other):
num = self.num * other.__num
den = self.den * other.__den
if den % num == 0:
den = den // num
num = 1
return self.__class__(num, den)
def __truediv__(self, other):
num = self.num * other.__den
den = self.den * other.__num
if den % num == 0:
den = den // num
num = 1
if num % den == 0:
num = num // den
den = 1
return self.__class__(num, den)
def __str__(self):
return f'{self.__num}/{self.__den}'
@classmethod
def from_string(cls, str_val):
numden = [int(x) for x in str_val.split('/')]
return Fraction(numden[0], numden[1])
fract1 = Fraction(1, 3)
fract2 = Fraction(1, 6)
fract = fract1 + fract2
print(f'{fract1} + {fract2} = {fract}')
fract = fract1 - fract2
print(f'{fract1} - {fract2} = {fract}')
fract = fract1 * fract2
print(f'{fract1} * {fract2} = {fract}')
fract = fract1 / fract2
print(f'{fract1} / {fract2} = {fract}')
fract3 = Fraction.add(fract1, fract2)
print(f'Mixin: {fract1} + {fract2} = {fract3}')
fract3 = Fraction.sub(fract1, fract2)
print(f'Mixin: {fract1} - {fract2} = {fract3}')
fract3 = Fraction.mul(fract1, fract2)
print(f'Mixin: {fract1} * {fract2} = {fract3}')
fract3 = Fraction.div(fract1, fract2)
print(f'Mixin: {fract1} / {fract2} = {fract3}')
fract4 = Fraction.from_string('4/5')
print(f'Classmethod from_string: {fract4}')
print(f'__str__: {fract1}')