-
[Python] Part.5 클래스Python 2023. 2. 7. 21:40
Ch05-01. 모듈과 패키지
모듈이란?
모듈은 함수나 변수, 클래스를 모아 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이라고도 할 수 있다.
모듈의 종류
- 표준 모듈 : 파이썬과 함께 따라오는 모듈
- 사용자 생성 모듈 : 프로그래머가 직접 작성한 모듈
- 서드 파티 모듈 : 파이썬 재단도 프로그래머(본인)도 아닌 다른 프로그래머 또는 업체에서 제공한 모듈
외부 모듈을 사용할 수 있도록 하는 방법은 import 파일명
확장자는 생략하고 파일에 있는 변수나 함수는 파일명.변수 도는 파일명.함수()로 호출
실제로 모듈을 만들어보자
variable = 3 def addition(x, y): return(x,y) 라 정의하고 이름을 my_func.py라고 저장한 뒤에 불러보자. _ import sys sys.path.append('/content/sample_data') _ import my_func _ my_func.variable # result 3 _ my_func.addition(3,4) # result 7
Import
Import는 다른 모듈 내의 코드에 대한 접근을 가능하게 하는 것으로, 변수, 함수, 클래스 등이 포함된다.
import 모듈 또는 from 모듈 import 함수이름1, 함수이름2 와 같은 형태로 입력. 와일드카드 *를 이용하면 모듈 내 모든 것을 가져온다.
만약 import를 입력하면 어떤 폴더에서 가져올까? sys.path를 통해 확인가능!
직접 위치를 추가하려면? sys.path.append(‘검색할 경로‘)
__name__ 변수란?
파이썬이 내부적으로 사용하는 특별한 변수로, 현재 실행중인 파일의 이름은 __main__이라는 이름으로, 불러온 모듈의 경우 모듈의 이름이 __name__이란 변수에 저장된다.
print(__name__) # result __main__ import sys sys.path.append('/content/sample_data') import my_func # result 실행된 모듈 이름 my_func
패키지란?
모듈들을 모아놓은 디렉토리 패키지에서 특정한 모듈을 가져올 때는 from my_package import my_module 과 같은 형식으로 불러오면 된다.
- 주의 python 3.3버전이전에는 디렉토리가 패키지로 인정받기 위해서는 __init__.py라는 파일이 내부에 있어야 했다
from test_package import test_module1 # result test_package.test_module1 _ import test_package.test_module2 # result test_package.test_module2
패키지 안의 모든 모듈을 불러오려면?
모듈 안의 모든 내용을 불러올 때 와일드 카드 *를 썼다.
그렇다면 패키지 안의 모든 모듈을 불러오려면 어떻게 해야할까?
→ 패키지 디렉토리 안에 __init__.py라는 이름의 파일을 만들고 __all__ = [‘모듈이름1’, ‘모듈이름2‘] 이런 식으로 와일드카드 *로 부를 수 있는 모듈 이름들을 직접 지정해 주어야 한다.
from test_package import * test_package.test_module1 test_package.test_module2
Ch05-02. 객체와 클래스
객체와 클래스
파이썬에서 class란 변수와 메소드(객체 내에 정의된 함수를 메소드라 부른다)를 정의하는 일종의 틀이다. 그리고 이러한 틀을 통해 생성된 것들을 객체(object) 또는 class의 instance라 부른다.
석고상을 만들 때 그것을 만들기 위한 틀을 만들고 거기에 석고를 부어서 잔뜩 찍어내는 걸 생각하면 된다. 여기서 틀이 class이고 찍어져 나온 결과물이 객체이다.
Class와 객체의 관계는 제품 설계도와 제품, 붕어빵기계의 틀과 붕어빵 같은 관계라고도 생각할 수 있다.
파이썬에서 클래스 정의하는 방법
class human: - class의 이름 정의 def __init__(self, height, age): - class가 처음 호출될 때 실행될 method self.height = height - class 변수 self.age = age def how_old(self, var1, var2): - class 메소드 print(self.age, '살 입니다.') print(var1) print(var2) def how_tall(self): print(self.height, 'cm 입니다.') _ sh = human(170, 17) # result 17 _ sh.height # result 170 _ sh.how_old('첫번째 변수', '두번째 변수') # result 20 살 입니다. 첫번째 변수 두번째 변수
객체를 정의하는 법
sh = human(180, 31) 변수 부르는 법 sh.height 메소드 호출 sh.how_old() 또는 human.how_old(sh)
같은 클래스의 두 객체는?
hello1 = human(180, 31) hello2 = human(180, 31) hello1 == hello2? False! 똑같은 값을 통해 객체를 생성했지만 objec는 생성될 때 마다 새로운 메모리 공간에 값을 생성하기 때문에 엄밀히 말하면 다른 값이다!
객체에 변수 추가하기
hello = human(180, 31) hello.weight = 90 이런 식으로 객체이름.변수이름 = 값 을 입력함으로써 객체에 변수를 추가할 수 있다.
메소드 생성에 유의할 점
메소드를 클래스 내부에 선언할 때는 첫 번째 매개변수는 반드시 현재 클래스의 객체가 되어야 합니다.
관습적으로 이를 self라는 단어로 표시합니다.
만약 메소드 내부에서 변수선언을 할 때 self.와 함께 선언을 하지 않을 경우 그 변수는 그 메소드의 지역변수가 됩니다.
Ch05-03. 객체지향과 절차지향
객체지향과 절차지향
- 절차지향(구조적 프로그래밍) : 데이터 구조와 그 데이터를 변화 시키는 알고리즘으로 구성
- 객체지향 : 객체들이 메시지를 통하여 통신함으로써 원하는 결과를 얻는다. 각 객체는 고유의 데이터와 데이터를 처리할 수 있는 메소드로 구성
사실 python은 모든 것이 객체이다.
이전에 보았던 string이나 list 또한 객체이다.
‘abcd’.upper() 이라는 호출을 통해 대문자로 바꾸었던 것을 기억하는가?
x = 'abcd' _ x.upper() # result 'ABCD' _ x = 3 x = 3.5
Ch05-04. 특수 매소드
생성자와 소멸자
- 생성자: __init__()
객체가 생성된 후 가장 먼저 호출되는 메소드 첫번째 매개변수는 self이며 이후에 매개변수 추가 가능 주로 멤버 변수의 초기화 코드로 작성
- 소멸자: __del__()
객체가 소멸될 때 호출되는 메소드 외부 자원을 사용하는 경우 해제하는 코드를 주로 작성 self 이외의 매개변수를 받지 않음
* del 객체이름 을 입력하면 삭제할 수 있다
class human: def __init__(self): self.height = 3 self.age = 3 def __del__(self): print('삭제됐지롱') _ sh=human() _ del sh # result 삭제됐지롱
정적 메소드
@staticmethod 데코레이터로 수식
인스턴스를 생성하지 않고 클래스를 이용해서 직접 호출할 수 있는 메소드 메소드 내에서 멤버 변수를 호출할 수 없고, self 매개변수도 사용하지 않습니다.
class 클래스이름: @staticmethod def 메소드이름(매개변수): 실행문장
class human: def __init__(self): self.height = 3 self.age = 3 @staticmethod def addition(x, y): return x+y _ human.addition(3,4) # result 7
클래스 메소드
@classmethod 데코레이터로 수식
정적 메소드와 유사하지만, 첫 번째 변수로 클래스 객체가 전달되는 것이 다름.
cls 매개변수 사용
class 클래스이름: @classmethod def 메소드이름(cls): 실행문장
예제
class student: count = 0 @classmethod def cmethod(cls): print("클래스 메소드") print(cls.count) @staticmethod def smethod(): print("정적 메소드") student.cmethod() student.smethod() # result 클래스 메소드 0 정적 메소드
심화학습 : private, public 변수
Private 멤버는 내부에서는 접근이 가능하지만 클래스 외부에서 접근이 안 되는 멤버.
Public 멤버는 클래스 외부에서 접근이 가능한 멤버.
python의 경우 기본적으로 모든 멤버는 public
예제
아래와 변수 이름 앞에 __를 붙여주면 은닉할 수 있고 setter를 통해 값을 바꿀 수 있으며 getter를 통해 값을불러올 수 있다. class human: def __init__(self): self.__age = 31 @property def age_getter(self): #getter return self.__age @age_getter.setter def age_setter(self, value): #setter self.__age = value _ sh.age_getter # result 31 _ sh.age_setter = 36 _ sh.age_getter # result 36
Ch05-05. 실전 문제풀이
mypi = 3.14 # 원의 면적 반지름 * 반지름 * 3.14 def area(r): return mypi * r * r #자체적으로 실행 if __name__=='__main__': print(round(area(12),(2))) print(area(10)) # result 452.16 314.0
def plus(x, y): return x + y def minus(x, y): return x - y def mutiply(x, y): return x * y def divide(x, y): return x / y if __name__=='__main__': print(plus(12, 3)) print(minus(12, 3)) print(mutiply(12, 3)) print(divide(12, 3)) # result 15 9 36 4.0
class car: # 클래스명은 대문자로 시작 def __init__(self): # 전역변수 선언할 때 사용, 생성자 self.color = 'red' # 속성/데이터/필드 초기화 self.wheel_size = 18 self.displacement = 2000 def forward(self): # 메서드. 함수 정의 print('전진') def backward(self): print('후진') def turn_left(self): print('좌회전') def turn_ringht(self): print('우회전') if __name__ == '__main__': # mycar : 객체이름. reference name, 인스탄스 이름 mycar = car() # 차라는 클래스를 이용하여 내차 생성 print(mycar.color) # 객체명, 속성 mycar.backward() # 객체명, 메소드명() # result red 후진
'Python' 카테고리의 다른 글
[Phthon] 문자열 함수 (0) 2023.04.05 [Python] Part.6 상속과 예외처리 (0) 2023.02.15 [Python] Part.4 함수 심화학습 (0) 2023.02.07 [Python] Part.3 함수 및 변수 (0) 2023.02.07 [Python] Part.2 제어문 (2) 2023.02.06