Python

Python - 6. 클래스

꿀먹는매미 2021. 3. 8. 13:22

클래스 - 파이썬 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