티스토리 뷰

목차

    반응형

    클래스 (class)

    Python 클래스(class)는 다음 예제와 같이 정의합니다. 클래스 이름은 관습적으로 대문자로 시작합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class MyClass:
        """A simple example class""" # 따옴표 3개로 코멘트
     
        def __init__(self):          # 컨스트럭터 (생성자)
            self.name = ""
     
        def getName(self):           # getName() 메소드
            return self.name
     
        def setName(self, name):     # setName() 메소드
            self.name = name
     
    = MyClass()                    # 클래스의 인스턴스 생성
    a.setName("Tanaka")              # setName() 메서드 호출
    print a.getName()                # getName() 메서드 호출
    cs


    파이썬 클래스 정의 시작 부분에는 """...""" 안에 도큐먼트 스트링(문서 문자열)을 작성할 수 있습니다. 


    1
    2
    3
    def MyClass:
        """A sample class"""
        (생략)
    cs

    클래스 변수, 인스턴스 변수(attribute)

    클래스는 인스턴스 변수, 클래스 변수를 가질 수 있습니다. 인스턴스 변수는 "인스턴스 변수 이름"으로 표시되며, 인스턴스별로 독립적입니다. 생성자 __init __ (후술)에서 초기화하는 것이 좋습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MyClass:
        def __init__(self):
            self.name = ""  # 인스턴스 변수
     
    a1 = MyClass()
    a1.name = "류현진"
     
    a2 = MyClass()
    a2.name = "손흥민"
     
    print a1.name            #=> 류현진
    print a2.name            #=> 손흥민
    cs


    클래스 변수는 "클래스 이름, 변수 이름"으로 표시되고 모든 인스턴스에서 공유하는 변수입니다.


    1
    2
    3
    4
    class MyClass:
        PI = 3.14        #=> 클래스 변수
     
    print MyClass.PI     #=> 3.14
    cs


    다음은 파이썬 클래스 변수를 사용하여 인스턴스 변수 값을 변경하는 샘플 코드입니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MyClass:
        count = 0               # 클래스 변수 초기화
     
        def __init__(self):
            MyClass.count += 1  # 클래스 변수 값 변경
     
    a1 = MyClass()
    a2 = MyClass()
    print MyClass.count         #=> 2
    cs


    클래스 변수와 인스턴스 변수는 동적으로 추가할 수 있습니다.


    1
    2
    3
    4
    5
    6
    class MyClass:
        pass
     
    a1 = MyClass()
    a1.name2 = "손흥민"      # 인스턴스 변수 추가
    MyClass.PI2 = 3.141593  # 클래스 변수 추가
    cs


    인스턴스 변수가 존재하지 않으면 "인스턴스 변수 이름"은 클래스 변수를 참조한다는 점을 유의하세요. "인스턴스 변수 이름"에 값을 할당한 시점에서 인스턴스 변수가 생성되며, 이후에는 인스턴스 변수가 참조됩니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MyClass:
        PI = 3.14
     
    a1 = MyClass()
    a2 = MyClass()
    print a1.PI         # 클래스 변수 MyClass.PI(3.14)가 참조됨
    a1.PI = 3.141593    # 인스턴스 변수 a1.PI가 생성됨
    print a1.PI         # 인스턴스 변수 a1.PI(3.141593)가 참조됨
    print a2.PI         # 클래스 변수 MyClass.PI(3.14)가 참조됨
    cs


    Python에서는 private, protected 등의 범위(스코프)를 제어하는 기능이 없어서, 클래스 변수, 인스턴스 변수는 어디서든(public) 참조할 수 있습니다.


    개발자를 위한 프로그래밍 팁개발자를 위한 프로그래밍 팁

    메소드 (method)

    파이썬 클래스가 보유한 함수를 메소드라고 합니다. 메소드도 어디서든(public) 참조할 수 있습니다. 함수의 첫 번째 인수는 클래스의 인스턴스, 두 번째 인수 이후가 메소드의 인수입니다.


    1
    2
    3
    4
    5
    6
    7
    class MyClass:
        name = ""
        def setName(self, name): # 첫 번째 인수는 자동 인스턴스 (self)
            self.name = name
     
    = MyClass()
    a.setName("류현진")
    cs


    액세스 제한 (_, __) (접근 제한)

    Python에서는 private, protected와 같은 액세스(접근) 한정자는 지원되지 않습니다. 밑줄 언더바( _ )로 시작하는 변수와 함수는 외부에서 참조하지 않는다는 보편적인 규칙이 있습니다. 밑줄 2개( __ )로 시작하는 변수 및 함수는 참조가 제한됩니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class MyClass:
        def __init__(self):
            self.name = "tanaka"
            self._name = "yamada"
            self.__name = "suzuki"
     
        def hello(self): print 'hello'
        def _hello(self): print 'hello'
        def __hello(self): print 'hello'
     
    = MyClass()
     
    print a.name        # 참조 가능
    print a._name       # 참조 가능. 관습적으로 참조하지 않음
    # print a.__name    # 참조 불가 (AttributeError 예외)
     
    a.hello()           # 참조 가능
    a._hello()          # 참조 가능. 관습적으로 참조하지 않음
    # a.__hello()       # 참조 불가 (AttributeError 예외)
    cs


    그래도 __로 시작하는 변수나 함수도 ,_ 클래스 이름 __ 변수 이름으로 변환 될 뿐, 아래 예제와 같은 방법으로 접근(액세스)할 수 있습니다.


    1
    2
    print a._MyClass__name
    a._MyClass__hello()
    cs

    생성자(__init__)

    __init__() 메서드는 클래스의 인스턴스가 생성될 때 호출됩니다. 생성자, 컨스트럭터, Constructor라고 합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    class MyClass:
        def __init__(self, name):
            self.name = name
        def getName(self):
            return self.name
     
    = MyClass("류현진")
    print a.getName()          #=> 류현진
    cs


    소멸자(__del__)

    __del __() 메서드는 파이썬 클래스의 인스턴스가 소멸될 때 호출됩니다. 소멸자, 디스트럭터, Destructor라고 합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    class MyClass:
        def __init__(self):
            print "INIT!"
        def __del__(self):
            print "DEL!"
     
    = MyClass()       #=> INIT!
    del a               #=> DEL!
    cs


    문자열 화 (__str__)

    __str__()는 인스턴스를 암시적으로 문자열로 변환할 때, 해당 변환 프로세스를 정의합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MyClass:
        def __init__(self, name):
            self.name = name
     
        def __str__(self):
            return "My name is " + self.name
     
    = MyClass("손흥민")
    print a                #=> My name is 손흥민
    cs


    개발자를 위한 프로그래밍 팁개발자를 위한 프로그래밍 팁


    상속 (inheritance)

    다른 객체지향 언어와 마찬가지로 클래스를 상속할 수 있습니다. 아래 예제에서는 MyClass 클래스를 상속한 MyClass2 서브 클래스를 정의합니다. 파이썬 서브 클래스는 부모 클래스가 가지는 속성과 메소드를 상속하여 이용할 수 있습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MyClass:
        def hello(self):
            print "우리형은"
     
    class MyClass2(MyClass):
        def world(self):
            print "메시다"
     
    = MyClass2()
    a.hello()           #=> 우리형은
    a.world()           #=> 
    cs


    서브 클래스는 부모 클래스의 메서드를 재정의(오버라이드, 오버라이딩) 할 수 있습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyClass:
        def hello(self):
            print "베리굿 조현"
     
    class MyClass2(MyClass):
        def hello(self):    # 부모 클래스의 hello() 메소드를 오버라이드(override)
            print "트와이스 지효"
     
    = MyClass2()
    a.hello()               #=> HELLO
    cs


    부모 클래스 (super ())

    super()는 부모 클래스를 참조하는 것입니다. 첫 번째 인수에는 클래스, 두 번째 인수에는 인스턴스를 지정합니다. 아래 예제에서는 서브 클래스의 생성자에서 부모 클래스의 생성자를 호출합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MyClass1(object):
        def __init__(self):
           self.val1 = 123
     
    class MyClass2(MyClass1):
        def __init__(self):
            super(MyClass2, self).__init__()
            self.val2 = 456
     
    = MyClass2()
    print a.val1                #=> 123
    print a.val2                #=> 456
    cs

    다중 상속

    Python은 다중 상속을 지원합니다. 아래 예제에는 MyClassA, MyClassB 모두 상속하는 MyClassC을 정의합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class MyClassA:
        def funcA(self):
            print "MyClassA:funcA"
     
    class MyClassB:
        def funcB(self):
            print "MyClassB:funcB"
     
    class MyClassC(MyClassA, MyClassB):
        pass
     
    = MyClassC()
    a.funcA()        # MyClassA 메소드도
    a.funcB()        # MyClassB 메소드도 사용 가능
    cs


    클래스 계층 구조

    Python 클래스는 모두 object를 루트로 하는 클래스 계층 구조로 구성되어 있습니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    object
     +- int
     |   +- bool
     +- long
     +- float
     +- complex
     +- basestring
     |   +- str
     |   +- unicode
     +- list
     +- tuple
     +- dict
     +- file
     +- BaseException
         +- SystemExit
         +- KeyboardInterrupt
         +- GeneratorExit
         +- Exception
             +- StopIteration
             +- StandardError
             |   +- BufferError
             |   +- ArithmeticError
             |   |   +- FloatingPointError
             |   |   +- OverflowError
             |   |   +- ZeroDivisionError
             |   +- AssertionError
             |   +- AttributeError
             |   +- EnvironmentError
             |   |   +- IOError
             |   |   +- OSError
             |   |       +- WindowsError (Windows)
             |   |       +- VMSError (VMS)
             |   +- EOFError
             |   +- ImportError
             |   +- LookupError
             |   |   +- IndexError
             |   |   +- KeyError
             |   +- MemoryError
             |   +- NameError
             |   |   +- UnboundLocalError
             |   +- ReferenceError
             |   +- RuntimeError
             |   |   +- NotImplementedError
             |   +- SyntaxError
             |   |   +- IndentationError
             |   |       +- TabError
             |   +- SystemError
             |   +- TypeError
             |   +- ValueError
             |       +- UnicodeError
             |           +- UnicodeDecodeError
             |           +- UnicodeEncodeError
             |           +- UnicodeTranslateError
             +- Warning
                 +- DeprecationWarning
                 +- PendingDeprecationWarning
                 +- RuntimeWarning
                 +- SyntaxWarning
                 +- UserWarning
                 +- FutureWarning
                 +- ImportWarning
                 +- UnicodeWarning
                 +- BytesWarning
    cs




    파이썬 입문 강좌 11강


    관련 글

    [파이썬 입문] 클래스 사용법 - 4단계로 마스터

    [파이썬 프로그래밍 함수] def, global, lambda, iterator, yield @ 사용 방법

    [파이썬 입문] 구문 - 문법, 주석, 들여쓰기, 인코딩 규칙

    [파이썬 입문] 제어문 - if else while for in break continue

    [파이썬 입문] 리스트 튜플 딕셔너리 (List, Tuple, dict)

    [파이썬 입문] 자료형 문자열 각종 수식 정리

    반응형