본문 바로가기

컴퓨터/Python

상속

부모클래스

>>> class Person:

" Paretn class "

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.PhonNumber))


자식클래스

>>> class Student(Person):

"child class"

def __init__(self, name, phoneNumber, subject, studentID):

self.Name = name

self.PhoneNumber = phoneNumber

self.Subject = subject

self.StudentID = studentID


>>> p = Person("Derick", "010-1234-5688")

>>> s = Student("Marry", "010-543-1234","Computer Science", "990999")

>>> p.__dict__

{'PhoneNumber': '010-1234-5688', 'Name': 'Derick'}

>>> s.__dict__

{'StudentID': '990999', 'PhoneNumber': '010-543-1234', 'Name': 'Marry', 'Subject': 'Computer Science'}


클래스의 정부는 내부적으로 __dict__라는 이름의 사전 객체로 관리됨



클래스 간의 관계 확인

issubclass() 내장함수 - 상속 관계인 두 클래스 간의 관계를 확인 함

issubclass(자식클래스, 부모클래스)




부모 클래스의 생성자 호출

>>> class Student(Person):

"child class"

def __init__(self, name, phoneNumber, subject, studentID):

Person.__init__(self, name, phoneNumber)        << 명시적으로 Person 생성자를 호출

self.Name = name

self.PhoneNumber = phoneNumber

self.Subject = subject

self.StudentID = studentID

인스턴스 객체를 나타내는 첫 인자인 'self'를 함께 전달해야 함



메서드 추가하기

>>> class Person:

" Paretn class "

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):

"child class"

def __init__(self, name, phoneNumber, subject, studentID):

Person.__init__(self, name, phoneNumber)

self.Name = name

self.PhoneNumber = phoneNumber

self.Subject = subject

self.StudentID = studentID

def PrintStudentData(self):

print("Student(Subject: {0}, Student ID: {1}".format(self.Subject, self.StudentID))


>>> s = Student("Derick", "010-123-4567", "Computer","990999")

>>> s.PrintPersonData()

Person(Name:Derick, Phone Number: 010-123-4567)

>>> s.PrintStudentData()

Student(Subject: Computer, Student ID: 990999

>>> dir(s)

['Name', 'PhoneNumber', 'PrintInfo', 'PrintPersonData', 'PrintStudentData', 'StudentID', 'Subject', '__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

>>> 



메서드 확장하기

Student 클래스에서 메서드 재정의를 한 PrintInfo()메서드

>>> 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.PhoneNumber))

def PrintPersonData(self):

print("Person(Name:{0}, Phone Number: {1})".format(self.Name, self.PhoneNumber))

>>> class Student(Person):

def __init__(self, name, phoneNumber, subject, studentID):

Person.__init__(self, name, phoneNumber)

self.Subject = subject

self.StudentID = studentID

def PrintStudentData(self):

print("Student(Subject: {0}, Student ID: {1})".format(self.Subject, self.StudentID))

def PrintInfo(self):        

Person.PrintPersonData(self)        << 명시적으로 Person 클래스의 PrintPersonData()를 호출

print("Info(Subject: {0}, Student ID: {1})".format(self.Subject, self.StudentID))



클래스 상속과 이름공간

상속 이전

인스턴스 객체 영역 >> 클래스 객체 영역 >> 전역 영역

상속 이후

인스턴스 객체 영역 >> 클래스 객체 간 상속을 통한 영역(자식 클래스 영역 >> 부모클래스 영역) >> 전역영역

>>> class SuperClass:

x = 10

def printX(self):

print(self.x)


>>> class SubClass(SuperClass):

y = 20

def printY(self):

print(self.y)


>>> s = SubClass()

>>> s.a = 30

>>> print("SuperClass: ", SuperClass.__dict__)

SuperClass:  {'__module__': '__main__', 'printX': <function printX at 0x1030f9c00>, '__dict__': <attribute '__dict__' of 'SuperClass' objects>, 'x': 10, '__weakref__': <attribute '__weakref__' of 'SuperClass' objects>, '__doc__': None}

>>> print("SubClass: ", SubClass.__dict__)

SubClass:  {'y': 20, 'printY': <function printY at 0x10377ad98>, '__module__': '__main__', '__doc__': None}

>>> print("s: ", s.__dict__)

s:  {'a': 30}





>>> class SuperClass:

x = 10

def printX(self):

print(self.x)


>>> class SubClass(SuperClass):

y = 20

def printX(self):                << SuperClass의 printX 재정의

print("SubClass: ", self.x) 

def printY(self):

print(self.y)


>>> s = SubClass()
>>> s.a = 30
>>> s.x = 50        << SuperClass의 멤버 데이터 x에 값 할당
>>> print("SuperClass: ", SuperClass.__dict__)
SuperClass:  {'__module__': '__main__', 'printX': <function printX at 0x10377c0d8>, '__dict__': <attribute '__dict__' of 'SuperClass' objects>, 'x': 10, '__weakref__': <attribute '__weakref__' of 'SuperClass' objects>, '__doc__': None}
>>> print("SubClass: ", SubClass.__dict__)
SubClass:  {'y': 20, 'printX': <function printX at 0x10377c050>, '__module__': '__main__', '__doc__': None, 'printY': <function printY at 0x10377c2f8>}
>>> print("s: ", s.__dict__)
s:  {'a': 30, 'x': 50}



'컴퓨터 > Python' 카테고리의 다른 글

모듈 만들기  (0) 2013.07.22
다중상속  (0) 2013.07.18
연산자 중복 정의  (0) 2013.07.17
정적메서드, 클래스메서드  (0) 2013.07.17
생성자, 소멸자 메서드  (0) 2013.07.16