연산자 중복 정의
-
연산자 중복 정의(Operator Overloading)
-
‘sub‘과 같이 두 개의 밑줄 문자가 앞뒤로 있는 메서드는
연산자 중복
을 위해 미리 정의된 특별한 메서드이다. -
파이썬에서는 이러한 연산자와 정의된 메서드의 이름 간에는 미리 맵핑이 되어 있다.
-
파이썬에서는 기본적으로 제공되는
연산자 중복 정의
가 없으므로개발자가
명시적
으로 중복하지 않은 연산자를 사용하는 경우TypeError
가 발생한다.
class GString:
def __init__(self, init=None):
self.content = init
def __sub__(self,str): # '-'연산자 중복
for i in str:
self.content = self.content.replace(i, '')
return GString(self.content)
def __abs__(self): # abs()내장 함수를 중복
return GString(self.content.upper())
def Print(self):
print(self.content)
g = GString("aBcdef")
g -= "df" # '-' 연산자가 중복된 경우 '-='도 지원
g.Print()
g = abs(g)
g.Print()
aBce
ABCE
-
’-=’과 같은
확장 연산자
가 존재하는 경우기본 연산자
(‘-‘)를 통해 연산이 가능하기에 중복된 기본 연산으로 대체되어 수행된다. -
위의 경우와 다르게 확장 연산자와 기본 연산자의 동작을 구분해야만 하는 경우도 필요하다.
class GString:
def __init__(self, init=None):
self.content = init
def __sub__(self,str): # '-'연산자 중복
print(" - operation is called !")
def __isub__(self,str): # '-='연산자 중복
print(" -= operation is called !")
g = GString("aBcdef")
g - "a"
g -= "a"
- operation is called !
-= operation is called !
-
위 코드에서 피연산자의 순서가 변경되면 TypeError가 발생한다.
-
객체 - 문자
의 경우__sub__
가 호출되지만“a” - g의 경우
__rsub__
메서드가 호출되기 때문이다.(def func(self,str)을 보면 [ 객체 - 문자 ] 구조이다! )
상속
상속
이란 클래스를 이용해 얻을 수 있는 특징 중 하나이다.
class Person:
" 부모 클래스 "
def __init__(self,name,phoneNumber):
self.Name = name
self.PhoneNumber = phoneNumber
def PrintInfo(self):
print("Info(Name : {0}, Phone Number : {1}" .format(self.Name, self.PhoneNumber))
def PrintPersonData(self):
print("Person(Name : {0}, Phone Number : {1}" .format(self.Name, self.PhoneNumber))
class Student(Person): # 1개 이상 다중 상복받는 경우 ','으로 구분해서 기입한다.
" 자식 클래스 "
def __init__(self,name,phoneNumber,subject,studentID):
self.Name = name
self.PhoneNumber = phoneNumber
self.Subject = subject
self.StudentID = studentID
def PrintInfo(self):
Person.PrintPersonData(self)
print("Info(Subject : {0}, Student ID : {1}" .format(self.Subject, self.StudentID))
p = Person("Derick", "010-123-4567")
s = Student("Marry", "010-987-6543", "Computer Science", "990999")
print(p.__dict__) # Person 인스턴스 객체
{'PhoneNumber': '010-123-4567', 'Name': 'Derick'}
- 클래스의 정보는 내부적으로
__dict__
라는 이름의 사전 객체로 관리 된다.