티스토리 뷰
목차
클래스 (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 a = 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 a = 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' a = 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 a = 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!" a = 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 a = 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 "메시다" a = 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 "트와이스 지효" a = 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 a = 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 a = 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강
- 자료형 문자열 각종 수식 정리
- 변수, 상수, 문서문자열(python docstring)
- 리스트 튜플 딕셔너리 (List, Tuple, dict)
- 제어문 - if else while for in break continue
- with assert pass del print exec 사용법
- 예외 처리 방식과 스택 추적 구현 방법
- 구문 - 문법, 주석, 들여쓰기, 인코딩 규칙
- 연산자 - 산술 비트 대입 비교 논리 조건
- def, global, lambda, iterator, yield @ 사용 방법
- 인스턴스, 메소드, 상속 등 예제 총정리
- 모듈 패키지 - 빌트인 파일 이름 사용 예제
관련 글
[파이썬 프로그래밍 함수] def, global, lambda, iterator, yield @ 사용 방법
[파이썬 입문] 구문 - 문법, 주석, 들여쓰기, 인코딩 규칙
[파이썬 입문] 제어문 - if else while for in break continue