부모클래스
>>> 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)
'컴퓨터 > Python' 카테고리의 다른 글
모듈 만들기 (0) | 2013.07.22 |
---|---|
다중상속 (0) | 2013.07.18 |
연산자 중복 정의 (0) | 2013.07.17 |
정적메서드, 클래스메서드 (0) | 2013.07.17 |
생성자, 소멸자 메서드 (0) | 2013.07.16 |