###### tags: `Algorithm`
# オブジェクト指向
変数やメソッドを定義したclassのことをオブジェクトと呼ぶ.
## 例
### 分数の計算
```python=
def gcd(a,b):
if b!=0:
return gcd(b,a%b)
else:
return a
class Rational:
def __init__(self,num,den):
self.num = num
self.den = den
##### 特殊メソッド
def __str__(self):
M = gcd(self.num,self.den)
#print(M)
return "{}/{}".format(self.num//M,self.den//M)
def __float__(self):
return float(self.num)/float(self.den)
def __mul__(self,other):
return Rational(self.num*other.num,self.den*other.den)
def __add__(self,other):
ans_num = self.num*other.den + other.num*self.den
ans_den = self.den*other.den
return Rational(ans_num,ans_den)
def __sub__(self,other):
ans_num = self.num*other.den - other.num*self.den
ans_den = self.den*other.den
return Rational(ans_num,ans_den)
def __floordiv__(self,other):
return Rational(self.num*other.den,self.den*other.num)
def __truediv__(self,other):
return float(Rational(self.num*other.den,self.den*other.num))
def show(self):
print("{}/{}".format(self.num,self.den))
#def mul(self):
#Rational(5,3).show()
print (Rational(8,20))
## 25/55, 22/55
print (Rational(5,11)*Rational(8,20))
print (Rational(5,11)+Rational(8,20))
print (Rational(5,11)-Rational(8,20))
print (Rational(5,11)//Rational(8,20))
print (Rational(5,11)/Rational(8,20))
print (type(Rational(5,11))==Rational)
```
#### 出力
```
2/5 # 8/20
2/11 # *
47/55 # +
3/55 # -
25/22 # //
1.1363636363636365 # /
True #Type of Rational(5,11) is Rational
```
### 複素数の計算
```python=
class Complex:
def __init__(self,re,im):
self.re = re
self.im = im
self.real = re
self.imaginary = im
def __str__(self):
if self.im>=0:
return "{}+{}j".format(self.re,self.im)
else:
return "{}-{}j".format(self.re,-self.im)
def __abs__(self):
return self.re**2 + self.im**2
def __add__(self,other):
real = self.re+other.re
imaginary = self.im+other.im
return Complex(real, imaginary)
def __sub__(self,other):
real = self.re-other.re
imaginary = self.im-other.im
return Complex(real, imaginary)
def __mul__(self,other):
real = self.re*other.re-self.im*other.im
imaginary = self.re*other.im+self.im*other.re
return Complex(real, imaginary)
def __truediv__(self,other):
con = Complex(other.re, -other.im)
div = other.re**2 + other.im**2
real = (con.re*self.re-con.im*self.im)/div
imaginary = (con.re*self.im+con.im*self.re)/div
print(Complex(real, imaginary))
def conjugate(self):
return Complex(self.re, -self.im)
```
## 疑問
違う型同士の計算をどう定義するか?
ex 5/3+1
ex 3+4i+5
## メモ
やること
「継承」、「カブセル化」、「ポリモーフィズム」
https://qiita.com/kaitolucifer/items/926ed9bc08426ad8e835