새소식

Python/Basics

22. class - 함수

  • -

1 체크 리스트

  1. 클래스에 클래스변수와 클래스함수( )를 정의할 수 있는가?
  2. 사용자가 정의한 클래스를 객체로 만들 수 있는가?
  3. 객체의 요소를 .도트연산자를 사용해 객체변수와 객체함수( )를 사용 할 수 있는가?
  4. 클래스 함수( )와 클래스 생성자( )를 구분하고 이해할 수 있는가?
  5. 생성자 오버로딩과 클래스 데코레이터를 이해하고 있는가?

2  클래스 함수

2.1 "도서"의 속성 (제목, 크기, 무게, 재질, 출판사, 발행일 등)을 클래스변수라는 소스 코드로 구현했다.

# 도서의 속성을 변수 로 구현
title = "파이썬 프로그래밍"
dttm = "2023-01-01"
size = "600 x 400 x 40"

# 도서의 속성을 클래스 로 구현
class book:
  title = "파이썬 프로그래밍"
  dttm = "2023-01-01"
  size = "600 x 400 x 40"
  
# 1
# book 클래스를 객체로 선언하고, 
# 클래스변수(title, dttm, size)를 print() 함수로 각각출력해보세요.

2.2 클래스 내부에, 함수를 만들어 실행 해보세요.

class book:
  title = "파이썬 프로그래밍"
  dttm = "2023-01-01"
  size = "600 x 400 x 40"

  def say():
    print("Hello Class")

# 1
# book 클래스를 객체로 선언하고, 클래스함수 say()를 사용해보세요

# tip
# 객체이름.클래스변수이름
# 객체이름.클래스함수이름

2.3 클래스 내부에, 문자열를 매개변수로 전달받아 출력하는 함수를 구현해보세요.

class book:
  title = "파이썬 프로그래밍"
  dttm = "2023-01-01"
  size = "600 x 400 x 40"
  
  def echo(str):
    print(str)

 

2.4 클래스 변수 title 의 값을 수정하는 클래스함수( )를 구현해보세요.

# * self 의미: "이 클래스의" 

class book:
  title = "파이썬 프로그래밍"
  dttm = "2023-01-01"
  size = "600 x 400 x 40"

  def setTitle(self, str):
    self.title = str

 

2.5 클래스변수 title, dttm, size 의 값을 수정하는 클래스함수( )를 각각 구현하고 실행해보세요

# 도서의 속성을 변수 로 구현
title = "파이썬 프로그래밍"
dttm = "2023-01-01"
size = "600 x 400 x 40"

# 도서의 속성을 클래스 로 구현
class book:
  title = "파이썬 프로그래밍"
  dttm = "2023-01-01"
  size = "600 x 400 x 40"

  def setTitle(self, str):
    self.title = str

  def setDttm(self, datetime):
    self.dttm = datetime
  
  def setSize(self, details):
    self.size = details

obj_book = book()
print(obj_book.title, obj_book.dttm, obj_book.size)

obj_book.setTitle(obj_book, "클래스변수를변경해보자")
print(obj_book.title)

obj_book.setDttm(obj_book, "날짜를변경해보자")
print(obj_book.dttm)

obj_book.setSize(obj_book, "사이즈를변경해보자")
print(obj_book.size)

3 클래스 생성자

: 클래스 생성자Constructor는 클래서 선언과 동시에 클래스변수를 초기화하는 작업을 한 번에 할 수 있도록 발전되었다.

3.1 클래스 초기화 원형

# 클래스에 클래스변수 3개를 선언하고
# 함수를 만들어, 클래스변수 3개에 값을 변경 할 수 있도록 구현하세요 

class cls:
  var1 = None 
  var2 = None
  var3 = None

  def setClassVars(self, pram1, pram2, pram3):
    self.var1 = pram1
    self.var2 = pram2
    self.var3 = pram3  
 
obj = cls()
obj.setClassVars("클래스변수", "입력하려면", "함수를써야죠")

3.2 클래스 초기화 축약

  • self 를 사용하게 되면서, 클래스변수 var1, var2, var3 를 생략 가능하다.
class cls:

  def setClassVars(self, pram1, pram2, pram3):
    self.var1 = pram1
    self.var2 = pram2
    self.var3 = pram3  
 
obj = cls()
obj.setClassVars("클래스변수", "입력하려면", "함수를써야죠")

3.3 클래스 생성자

  • 위의 "클래스변수 초기화 → 축약" 내용과 생성자를 사용한 객체 선언 과정을 비교해보자
  • 생성자를 통해 선언과 동시에 클래스변수를 초기화 할 수 있게 되었다.
class cls2:

  def __init__(self, pram1, pram2, pram3): #생성자
    self.var1 = pram1
    self.var2 = pram2
    self.var3 = pram3  
 
obj = cls2(obj, "클래스변수", "입력하려면", "함수를써야죠")

3.4 클래스 생성자 사용 문제

파이썬에서는 생성자를 여러개 만들 수 없다.

그래서 생성자를 매개변수를 정의하면, 객체 선언시 매개변수의 갯수만큼 실인수를 무조건 입력해야 한다,

class cls4:

  def __init__(self, pram1, pram2, pram3):
    self.var1 = pram1
    self.var2 = pram2
    self.var3 = pram3  
 
obj = cls4() # 불가능하다 pram1, pram2, pram3 자리의 실인수를 입력해야 한다.
# TypeError: __init__() missing 3 required positional arguments: 'pram1', 'pram2', and 'pram3'

방법 1

# 매개변수 자리수 만큼 None 처리
obj = cls4(None, None, None)

방법 2

# @classmethod 데코레이터를 이용해, 클래스 함수를 구현한다.

class cls5:

  def __init__(self, pram1, pram2, pram3):
    self.var1 = pram1
    self.var2 = pram2
    self.var3 = pram3  

  @classmethod
  def init(cls):
    return cls(None, None, None)

obj1 = cls5("생성자의", "매개변수를", "입력해야한다.")
obj2 = cls5.init()
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.