클래스 - 파이썬 3.6 프로그래밍 p.93~130
클래스
멤버프로퍼티(필드)
클래스 - 변수
인스턴스 - self(this)
멤버메서드
__init__(self)
- 클래스의 선언
- dir() 로 이름공간에 클래스가 선언된것 확인
# class01.py
class Cookie:
pass
print( dir() ) # Cookie가 등록이 되있는것 확인 가능 (이름만)
# 인스턴스 객체 생성
c1 = Cookie()
c2 = Cookie()
print( type(c1) )
print( type(c2) )
print( id(c1) )
print( id(c2) )
- 인스턴스 객체 성성과 멤버 변수값 출력하기
# class02.py
class Cookie:
a = 10
b = 20
c1 = Cookie()
print( c1.a )
- 멤버 메서드 사용과 self(=this)
# class03.py
class Cookie:
# 함수
#def func1():
# print( 'func1 호출' )
# self = this
def func1(self) :
print( 'func1 호출', self )
def func2(self, a, b) :
print( 'func2 호출', a )
print( 'func2 호출', b )
c1 = Cookie()
print( c1 )
c1.func1()
c1.func2(1,2)
- 동적으로 멤버변수 선언, 초기화
- setter / getter
# class04.py
class Cookie:
'''
def func1(self):
# 동적으로 인스턴스 멤버변수 선언 / 초기화
self.a = 10
print( 'self.a :', self.a )
'''
# setter
def func1(self, a):
self.a = a
# getter
def func2(self):
return self.a
c = Cookie()
c.func1(10)
print( c.func2() )
- 생성자 ( __init___ )
# class05.py
class Cookie:
# 생성자
'''
def __init__(self):
print( '__init__호출' )
'''
def __init__(self, first, second):
self.first = first
self.second = second
def add(self):
return self.first + self.second
c = Cookie( 10, 20 )
print( c.add() )
- 소멸자( __del__ )
# class06.py
class MyClass :
def __init__(self, value):
self.value = value
print( 'Class is created! Value=', value )
def __del__(self):
#클래스에 대한 마무리 작업
# finally
print( 'Class is deleted!' )
def foo():
my = MyClass( 10 )
foo()
- 정적 메서드, 클래스 메서드
정적 메서드 : 인스턴스 객체를 통하지 않고 클래스를 통해 직접 호출 할 수 있는 메서드
'self'라는 인자를 선언하지 않음
# class07.py
class CountManeger:
insCount = 0
def __init__(self):
CountManeger.insCount += 1
def instancePrint(self):
print( 'Instance Count', CountManeger.insCount )
# static 메서드 등록
def staticPrint():
print( 'Static Count', CountManeger.insCount )
SprintCount = staticmethod( staticPrint )
# class 메서드로 등록
def classPrint(classname):
print( 'Class Count', classname.insCount )
CprintCount = classmethod( classPrint )
a, b, c = CountManeger(), CountManeger(), CountManeger()
# 클래스 메서드 호출
# CountManeger.staticPrint(self)
# b.staticPrint()
CountManeger.SprintCount()
CountManeger.CprintCount()
- 상속
# class08.py
class Base:
def __init__(self):
print( 'Base 생성자' )
def base_method(self):
print( 'Base method' )
class Derived(Base):
# 생성자 오버라이딩
#def __init__(self):
# print( 'Derived 생성자' )
pass
#base = Base()
#base.base_method()
# 상속 (생성자도 불러서 사용됨)
derived = Derived()
derived.base_method()
- 부모 자식 클래스
# class09.py
class Person:
" 부모 클래스 "
def __init__(self, name, phoneNumber):
self.Name = name
self.PhoneNumber = phoneNumber
class Student(Person):
" 자식 클래스 "
def __init__(self, name, phoneNumber, subject, studentID):
self.Name = name
self.PhoneNumber = phoneNumber
self.Subject = subject
self.StudentID = studentID
p = Person( "Derick", "010-123-4567" )
s = Student( "Marry", "010-654-1234", "Computer Science", "990999" )
# toString() / json처럼 관리됨
print( p.__dict__ )
print( s.__dict__ )
# 부모 자식 관계인지 확인 = issubclass( a, b ) => b가 a의 부모클래스 : True
print( issubclass( Student, Person ) )
print( issubclass( Person, Student ) )
# 모든 클래스는 암묵적으로 object 클래스를 상속 받음
print( issubclass( Person, object ) )
print( issubclass( Student, object ) )
# 직계 부모 클래스를 튜플로 반환 ( __bases__ )
print( Person.__bases__ )
print( Student.__bases__ )
- 다중상속 허용됨 -> 중복 호출의 문제 발생 -> super()를 사용해서
# class10.py
class Animal:
def __init__(self):
print( 'Animal __init__()' )
class Tiger:
def __init__(self):
Animal.__init__(self)
print( 'Tiger __init__()' )
class Lion:
def __init__(self):
Animal.__init__(self)
print( 'Lion __init__()' )
# 다중 상속을 허용
class Liger:
def __init__(self):
Tiger.__init__(self)
Lion.__init__(self)
print( 'Liger __init__()' )
# 중복호출 문제 발생
liger = Liger()
# class11.py
class Animal:
def __init__(self):
print( 'Animal __init__()' )
class Tiger(Animal):
def __init__(self):
super().__init__()
print( 'Tiger __init__()' )
class Lion(Animal):
def __init__(self):
super().__init__()
print( 'Lion __init__()' )
# 다중 상속을 허용
class Liger(Tiger, Lion):
def __init__(self):
super().__init__()
print( 'Liger __init__()' )
# super()로 중복호출 제거
liger = Liger()
print( Liger.__bases__ )
print( Liger.__mro__ )
- 다중상속시 상속 순서
# class13.py
class Animal:
def __init__(self):
print( 'Animal __init__()' )
class Tiger():
def __init__(self):
print( 'Tiger __init__()' )
def jump(self):
print( '호랑이 점프' )
def cry(self):
print( '호랑이 cry' )
class Lion():
def __init__(self):
print( 'Lion __init__()' )
def bite(self):
print( '사자 물기' )
def cry(self):
print( '사자 cry' )
# 상속 순서
# class Liger(Tiger, Lion):
class Liger(Lion, Tiger):
def __init__(self):
Tiger.__init__(self)
Lion.__init__(self)
print( 'Liger __init__()' )
def play(self):
print( '라이거 놀기' )
liger = Liger()
liger.jump()
liger.bite()
liger.play()
liger.cry() # 상속순서에 따라 출력 달라짐
print( Liger.__mro__ )
- 메서드 오버라이딩(재정의)
# class12.py
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):
" 자식 클래스 "
def __init__(self, name, phoneNumber, subject, studentID):
self.Name = name
self.PhoneNumber = phoneNumber
self.Subject = subject
self.StudentID = studentID
# 메소드 오버라이딩
def PrintInfo(self):
print( "Info(Name:{0}, Phone Number: {1})".format( self.Name, self.PhoneNumber ) )
print( "Info(Subject:{0}, Student ID:{1})".format( self.Subject, self.StudentID ))
p = Person( "Derick", "010-123-4567" )
s = Student( "Marry", "010-654-1234", "Computer Science", "990999" )
s.PrintInfo()
'Python' 카테고리의 다른 글
Python - 8. 모듈 (0) | 2021.03.10 |
---|---|
Python - 7. 예외 처리 (0) | 2021.03.09 |
Python - 5. 함수 (0) | 2021.03.08 |
Python - 4. 제어문(조건문과 반복문) (0) | 2021.03.05 |
Python - 3. 자료형 및 연산자 (2) (리스트, 세트, 튜플, 사전) (0) | 2021.03.05 |