Python class
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
3 클래스 정의[편집]
class CustomClass:
def __init__(self, param):
.......
3.1 클래스 생성 연습[편집]
에디터에서 airtravel.py 파일 생성.
클래스 생성은 아래와 같이 class 키워드 및 클래스의 이름을 입력하여 생성.
class Flight:
pass
생성한 클래스는 REPL(read-eval-print loop,사용자의 입력 후 실행하고 결과를 반환시키는 프로그래밍 환경)에서 아래와 같이 import할 수 있음.
>>> from airtravel import Flight
>>> Flight
<class 'airtravel.Flight'>
4 클래스 메소드 작성[편집]
- 메소드 작성하기
class Flight:
def number(self):
return 'KR949'
4.1 인스턴스 메소드의 접근[편집]
- 인스턴스의 메소드 사용
>>> from airtravel import Flight
>>> f = Flight()
>>> f.number()
'KR949'
>>> Flight.number(f) # f는 Flight객체
'KR949'
5 생성자와 초기화자[편집]
5.1 생성자/초기화자 예제[편집]
5.1.1 생성자 / 초기화 실행 순서 확인[편집]
class Flight:
#초기화자
def __init__(self):
print('init')
super().__init__()
# 생성자
def __new__(cls):
print('new')
return super().__new__(cls)
# 메소드
def number(self):
return 'KR949'
>>> from airtravel import Flight
>>> f = Flight()
--- 결과 --
new
init
Flight클래스를 수정후 다시 실행 .
- __new__ 메소드는 자동으로 실행되므로 제거합니다.
- __init__ 메소드에 코드를 수정합니다.
아래의 코드에서 self._number 로 할당했는데
class Flight:
def __init__(self, number):
self._number = number
def number(self):
return self._number
다시 REPL에서 확인 합니다.
>>> from airtravel import Flight
>>> f = Flight(5)
>>> f.number()
5
>>> f._number
5
6 접근제어자[편집]
6.1 초기화자(__init__)객체의 불변성을 확립(유효성검증 수행)[편집]
- 비행기 번호는 앞에 두글자는 영문이어야하며 대문자입니다.
- 그리고 뒤에 세번째 글자부터 마지막까지는 양의 정수여야합니다.
Flight클래스를 다음과 같이 변경해봅니다.
객체를 생성시 규칙에 맞지 않는 값이 들어오면 ValueError를 발생시킵니다.
class Flight:
def __init__(self, number):
if not number[:2].isalpha():
raise ValueError("첫 두글자가 알파벳이 아닙니다.")
if not number[:2].isupper():
raise ValueError("첫 두글자가 대문자가 아닙니다.")
if not number[2:].isdigit():
raise ValueError("세번째 글자 이상이 양의 숫자가 아닙니다.")
self._number = number
...생략
>>> from airtravel import Flight
>>> f= Flight("abc")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/Blidkaga/Documents/CodeLab/Python_Basic/airtravel.py", line 11, in __init__
raise ValueError("첫 두글자가 대문자가 아닙니다.")
ValueError: 첫 두글자가 대문자가 아닙니다.
>>> f= Flight("AB0")
>>> f= Flight("AB001")
7 비공개 속성[편집]
>>> f= Flight("AB001")
>>> f._number
'AB001'
>>> f._number = 'abc'
>>> f.number()
'abc'
7.1 언더바를 던더바로 변경[편집]
_name 변수를 __name으로 변경하였습니다.
class Flight:
def __init__(self, number):
if not number[:2].isalpha():
raise ValueError("첫 두글자가 알파벳이 아닙니다.")
if not number[:2].isupper():
raise ValueError("첫 두글자가 대문자가 아닙니다.")
if not number[2:].isdigit():
raise ValueError("세번째 글자 이상이 양의 숫자가 아닙니다.")
self.__number = number
def number(self):
return self.__number
7.2 결과 확인.[편집]
- number()인스턴스 메소드를 통해서 내부에서는 접근 가능한 모습을 보이나, 객체 f의 속성으로 접근 시 에러가 발생합니다.
>>> from airtravel import Flight
>>> f= Flight("AB001")
>>> f.number()
'AB001'
>>> f.__number
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Flight' object has no attribute '__number'
8 파이썬은 메소드 오버로딩이 없다.[편집]
- Java코드는 아래와 같은 코드를 허용합니다.
class Adder{
static int add(int a,int b)
{
return a+b;
}
static int add(int a,int b,int c)
{
return a+b+c;
}
}
class Korea:
def __init__(self, name,population, captial):
self.name = name
self.population = population
self.capital = captial
def show(self):
print(
"""
국가의 이름은 {} 입니다.
국가의 인구는 {} 입니다.
국가의 수도는 {} 입니다.
""".format(self.name, self.population, self.capital)
)
def show(self, abc):
print('abc :', abc)
결과
>>> from inheritance import *
>>> a = Korea('대한민국',50000000, '서울')
>>> a.show()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: show() missing 1 required positional argument: 'abc'
9 클래스 내부에서 메소드 호출[편집]
class MyClass:
def set(self,v):
self.value =v
def incr(self):
self.set(self.value+1)
def put(self):
print(self.value)
c = MyClass()
c.set('egg')
c.put()
10 생성자 와 소멸자[편집]
__init__ #생성자 __del__ #소멸자