Gidhub BE Developer

연산자 중복 정의, 상속

2018-02-06
goodGid

연산자 중복 정의

  • 연산자 중복 정의(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__라는 이름의 사전 객체로 관리 된다.

Comments

Content