2 λΆ„ μ†Œμš”

ν΄λž˜μŠ€λ©”μ†Œλ“œ..?

ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ‹€λ³΄λ‹ˆ, @classmethod λ₯Ό μ‚¬μš©ν•˜λŠ” 일이 μžˆμ—ˆλ‹€.

chatgpt apiλ₯Ό μ‚¬μš©ν•˜λ©΄μ„œ, 닡변을 λ°›μ•„μ˜€λŠ”λ°μ— ν•„μš”ν•œ 뢀뢄듀을 __init__() 으둜 λΆ„λ¦¬ν•˜λŠ” κ³Όμ •μ—μ„œ μ‚¬μš©ν–ˆλ‹€.

κΈ°μ‘΄ chatgpt api code

messages = []

class ChatGptApi:
    openai.api_key = CHATGPT_API_KEY # APIν‚€ μž…λ‹ˆλ‹€. 외뢀에 κ³΅κ°œν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.

    def get_completion(content): 
        # μ‚¬μš©μž μž…λ ₯을 λ°›μŠ΅λ‹ˆλ‹€.
        # content = input("input content: ")
        print("input message: ", content)

        # μ‚¬μš©μž μž…λ ₯을 messages에 μΆ”κ°€ν•΄μ€λ‹ˆλ‹€.
        messages.append({"role": "user", "content": f"{content}"})

        completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",	# λͺ¨λΈ 지정
            messages=messages,		# 질문 및 λ‹΅λ³€
            max_tokens=1024,		# μ΅œλŒ€ 토큰 수 μ œν•œ
            n=1, 					# λ‹΅λ³€ 개수
            stop=None, 				# λ‹΅λ³€ 쀑단 μ˜ˆμ•½μ–΄ μ„€μ •
            temperature=0.5			# λ‹΅λ³€μ˜ μ°½μ˜μ„± μ„€μ •
        )

        # gptλ‘œλΆ€ν„° 응닡을 λ°›μŠ΅λ‹ˆλ‹€.
        # strip() : 응닡이 올 λ•Œ, 빈 곡간 제거
        assistance_content = completion.choices[0].message['content'].strip()

        # assistance에 이전 λŒ€ν™” 닡변을 μ €μž₯ν•©λ‹ˆλ‹€.
        messages.append({"role": "assistant", "content": f"{assistance_content}"})

        print(f'ChatGPT : {assistance_content}')
        return assistance_content

λ³€κ²½ν•œ chatgpt api code

messages = []

class ChatGptApi:
    openai.api_key = CHATGPT_API_KEY # APIν‚€ μž…λ‹ˆλ‹€. 외뢀에 κ³΅κ°œν•˜λ©΄ μ•ˆλ©λ‹ˆλ‹€.

    def __init__(self):
        self.model = "gpt-3.5-turbo" # λͺ¨λΈ 지정
        self.max_tokens = 1024       # μ΅œλŒ€ 토큰 수 μ œν•œ
        self.n = 1                   # λ‹΅λ³€ 개수
        self.stop = None             # λ‹΅λ³€ 쀑단 μ˜ˆμ•½μ–΄ μ„€μ •
        self.temperature = 0.5       # λ‹΅λ³€μ˜ μ°½μ˜μ„± μ„€μ •
        
        self.completion = openai.ChatCompletion.create(
            model = self.model,
            messages = messages,		# 질문 및 λ‹΅λ³€
            max_tokens = self.max_tokens,
            n = self.n,
            stop = self.stop, 
            temperature = self.temperature
        )

    @classmethod
    def get_completion(cls, content): 
        # μ‚¬μš©μž μž…λ ₯을 λ°›μŠ΅λ‹ˆλ‹€.
        print("input message: ", content)

        # μ‚¬μš©μž μž…λ ₯을 messages에 μΆ”κ°€ν•΄μ€λ‹ˆλ‹€.
        messages.append({"role": "user", "content": f"{content}"})

        completion = cls().completion

        # gptλ‘œλΆ€ν„° 응닡을 λ°›μŠ΅λ‹ˆλ‹€.
        assistance_content = completion.choices[0].message['content'].strip()

        # assistance에 이전 λŒ€ν™” 닡변을 μ €μž₯ν•©λ‹ˆλ‹€.
        messages.append({"role": "assistant", "content": f"{assistance_content}"})

        print(f'ChatGPT : {assistance_content}')
        return assistance_content
 

바뀐 λΆ€λΆ„?

get_completion() 을 보면, @classmethod λ°μ½”λ ˆμ΄ν„°μ™€ ν•¨κ»˜ cls μΈμžμ™€ cls().completion 을 λ³Ό 수 μžˆλ‹€.

이제 이 κ²ƒμ˜ μ˜λ―Έμ™€ μ‚¬μš© μ΄μœ μ— λŒ€ν•΄ μ •λ¦¬ν•˜κ² λ‹€.

@classmethod

@classmethod λŠ” 클래슀둜 ν˜ΈμΆœν•˜κΈ° μœ„ν•œ λ©”μ†Œλ“œμ΄λ‹€.

cls λŠ” class의 μ€€λ§λ‘œ νŒŒμ΄μ¬μ—μ„œ κ΄€λ‘€λ‘œ μ‚¬μš©λ˜λŠ” λ³€μˆ˜λͺ…이고, 이건 클래슀 본인을 λœ»ν•˜λŠ” λ³€μˆ˜λ‹€.

보톡 class λ‚΄λΆ€μ˜ methodμ—μ„œ self λ₯Ό μ“°λŠ” κ²½μš°κ°€ λ§Žμ€λ°, selfλŠ” μΈμŠ€ν„΄μŠ€ 본인 을 λœ»ν•œλ‹€λ©΄, clsλŠ” 클래슀 자기 μžμ‹ μ΄λ‹€.

μ™œ μ“ΈκΉŒ?

  def get_completion(cls, content): 
      # μ‚¬μš©μž μž…λ ₯을 λ°›μŠ΅λ‹ˆλ‹€.
      print("input message: ", content)

      # μ‚¬μš©μž μž…λ ₯을 messages에 μΆ”κ°€ν•΄μ€λ‹ˆλ‹€.
      messages.append({"role": "user", "content": f"{content}"})

      completion = ChatGptApi().completion

      # gptλ‘œλΆ€ν„° 응닡을 λ°›μŠ΅λ‹ˆλ‹€.
      assistance_content = completion.choices[0].message['content'].strip()

      # assistance에 이전 λŒ€ν™” 닡변을 μ €μž₯ν•©λ‹ˆλ‹€.
      messages.append({"role": "assistant", "content": f"{assistance_content}"})

      print(f'ChatGPT : {assistance_content}')
      return assistance_content

μœ„ μ½”λ“œλŠ” @classmethod λ°μ½”λ ˆμ΄ν„°λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ€ 경우의 μ½”λ“œμ΄λ‹€.

λ¬Όλ‘  μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ” 것은 λΆ„λͺ…ν•˜λ‹€.

λ‹€λ§Œ, 클래슀 본인의 호좜이 ν•„μš”ν•œ κ²½μš°μ—λŠ” Pythonic(파이썬슀러운) μ½”λ“œλ₯Ό μœ„ν•΄ λ°μ½”λ ˆμ΄ν„°λ₯Ό ν†΅ν•œ λͺ…μ‹œκ°€ 있으면 μ’‹κΈ° λ•Œλ¬Έμ— μ‚¬μš©ν•œλ‹€. β†’ λ§žμ„κΉŒ(?)

@staticmethod

@staticmethod λŠ” self 와 cls 인자λ₯Ό ν•„μš”λ‘œ ν•˜μ§€ μ•ŠλŠ” λ©”μ„œλ“œμ΄λ‹€.

class Robot:

    ...
    
    # @staticmethod μ£Όμ„μ²˜λ¦¬
    def μŠ€νƒœν‹±λ©”μ„œλ“œ():
        print('μŠ€νƒœν‹±λ©”μ„œλ“œ 호좜')
        
        
robot = Robot('λ‹€μ½”')

robot.μŠ€νƒœν‹±λ©”μ„œλ“œ() # μΈμŠ€ν„΄μŠ€λ‘œ 호좜
Robot.μŠ€νƒœν‹±λ©”μ„œλ“œ() # 클래슀둜 호좜

'''
>>>
TypeError: μŠ€νƒœν‹±λ©”μ„œλ“œ() takes 0 positional arguments but 1 was given
'''

μœ„ 예제λ₯Ό 보면 μΈμŠ€ν„΄μŠ€λ‘œ μŠ€νƒœν‹±λ©”μ„œλ“œ()λ₯Ό ν˜ΈμΆœν–ˆλŠ”λ° μ—λŸ¬κ°€ λ°œμƒν•œ 것을 λ³Ό 수 μžˆλ‹€.

인자둜 아무 것도 받지 μ•Šμ•„μ•Ό ν•˜λŠ”λ°, 1개의 μΈμžκ°€ λ“€μ–΄μ™”λ‹€λŠ” λœ»μ΄λ‹€.

μ—¬κΈ°μ„œ μ•Œ 수 μžˆλŠ” 것은 μΈμŠ€ν„΄μŠ€λ‘œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ, 인자λ₯Ό λ”°λ‘œ 넣지 μ•Šμ•„λ„ μžλ™μœΌλ‘œ μΈμžκ°€ λ“€μ–΄κ°„λ‹€λŠ” 뜻이고, 이 μΈμžλŠ” λ°”λ‘œ self 인 것이닀.

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” 두 가지 방법이 μžˆλ‹€.

  1. self 인자λ₯Ό λ„£μ–΄μ£ΌλŠ” 방법

     def μŠ€νƒœν‹±λ©”μ„œλ“œ():
             print('μŠ€νƒœν‹±λ©”μ„œλ“œ 호좜')
    
    • μ΄λ ‡κ²Œ ν•˜λ©΄ μŠ€νƒœν‹±λ©”μ„œλ“œλŠ” μΈμŠ€ν„΄μŠ€λ©”μ„œλ“œκ°€ λ˜λŠ” 것이닀. ν•˜μ§€λ§Œ, ν΄λž˜μŠ€μ—μ„œ ν˜ΈμΆœμ„ ν•˜κ²Œλ  경우 μΈμŠ€ν„΄μŠ€ 인자λ₯Ό ν•„μš”λ‘œ ν•˜κ²Œ λœλ‹€.
  2. @staticmethod λ₯Ό μ‚¬μš©ν•˜λŠ” 방법

     @staticmethod
     def μŠ€νƒœν‹±λ©”μ„œλ“œ():
         print('μŠ€νƒœν‹±λ©”μ„œλ“œ 호좜')
    
    • μ΄λ ‡κ²Œ ν•˜λ©΄ 인자λ₯Ό 받지 μ•Šμ•„λ„ λ™μž‘ν•˜λŠ” 클래슀 λ‚΄μ˜ 정적 λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•  수 μžˆλ‹€.

κ·Έλƒ₯ μ–΄λ–€ 속성에도 λ³€ν™”λ₯Ό μΌμœΌν‚€μ§€ μ•Šκ³ , μž…λ ₯이 λ“€μ–΄μ˜€λ©΄ 항상 같은 좜λ ₯을 λ°˜ν™˜ν•˜λŠ” μˆœμˆ˜ν•¨μˆ˜ 라고 μƒκ°ν•˜μž.

μš”μ•½

@classmethod 와 @staticmethod λŠ” 객체의 λ©”μ„œλ“œλ₯Ό 더 μ§κ΄€μ μœΌλ‘œ μ„€κ³„ν•˜κ³  κ°„νŽΈν•˜κ²Œ ν˜ΈμΆœν•˜κΈ° μœ„ν•œ λ°μ½”λ ˆμ΄ν„°μ΄λ‹€.

μ•žμœΌλ‘œ 이 두 녀석을 λ§Œλ‚˜λ©΄ 클래슀둜 ν˜ΈμΆœν•˜κΈ° μœ„ν•œ λ©”μ„œλ“œ, self, cls μΈμžκ°€ ν•„μš” μ—†λŠ” λ©”μ„œλ“œ 둜 μ΄ν•΄ν•˜λ©΄ νŽΈν•˜κ² λ‹€.

참고자료

Python _ @classmethod, @staticmethod λž€ 무엇인가?

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°