본문 바로가기
카테고리 없음

[Python] Class

by 까다로운오리 2024. 3. 31.

 

Class의 개념을 파이썬 처음 공부할 때, 간단하게 지나가고 그 뒤로 어렴풋이 아는 개념으로 사용해했었다. 현업에 나와보니 개념 하나하나 정확하게 아는게 너무너무 중요하다는 것을 깨닫고.. 확실한 코드를 짜기 위해선 확실하게 개념을 다시 공부해야겠다는 생각이 들어 그렇게 다시 class를 공부하게 되었다.

 

 

Class

- 클래스 : 객체를 만들기 위한 설계도

- 객체 : 설계도로 부터 만들어 낸 제품

 

#클래스를 사용하지 않을 때


champion1_name = "이즈리얼"
champion1_health = 700
champion1_attack = 90

print(f"{champion1_name} 님 소환사의 협곡에 오신것을 환영합니다.")

champion2_name = "리신"
champion2_health = 800
champion2_attack = 90

print(f"{champion2_name} 님 소환사의 협곡에 오신것을 환영합니다.")

def basic_attack(name, attack):
    print(f"{name} 기본공격 {attack}")
    
basic_attack(champion1_name, champion1_attack)
basic_attack(champion2_name, champion2_attack)

 

 

#클래스를 사용할 때

class Champion:
    def __init__(self, name, health, attack):
        self.name = name
        self.health = health
        self.attack = attack
        print(f"{name}님 소환사의 협곡에 오신것을 환영합니다.")
    def basic_attack(self):
    	print(f"{self.name} 기본공격 {self.attack}")
  
  
ezreal = Champion("이즈리얼", 700, 90)
leesin = Champion("리신", 800, 90)

ezreal.basic_attack()
leesin.basic_attack()

 

Class 사용하는 이유?

- 만약 위 코드에서 야스오가 추가되면, 클래스가 없는 경우는 하나하나 다 복사해야함

- class를 사용하면 yeasuo = Champion("야스오", 800, 90) 만 추가하면 되기 때문에 편리

- 즉, 클래스를 사용하면, 속도와 코드양 가독성에서 효율적

 

 

 

Class 구성요소 ?

 

 - 속성 : 특징(변수)

- 메서드 : 동작(함수)


class 클래스 이름:
	def 메서드 이름(self):
    	명령블록

 

 

Class __inti__ self,

class Moster:
	def __init(self, health, attack, speed): 인스턴스를 만들 때 가장 먼저 호출되는 메서드
    	self.health = health
        self.attack = attack
        self.speed = speed
    
    def decrease_health(self, num):
    	self.health -= num
        
gobling = Moster(100,10,4) #인스턴스 생성

 

 

 

Class 상속?

- 자식 클래스들의 공통된 메서드 및 속성들을 부모클래스로 합쳐서 코드의 중복성을 피하기 위함

class Moster:
	def __init(self, health, attack, speed): 
    	self.health = health
        self.attack = attack
        self.speed = speed
    
    def move(self):
    	print("지상에서 이동")
        
def Wolf(Moster):
	pass				# 정의만 하고 싶을 때 pass 사용
		

def Shark(Moster):			# init 생성 가능 Moster와 Init 공유
	def move(self):			# 메서드 오버라이딩 : 메서드 재정의
    	print("헤엄치기")

 

 

import random

class Moster:
	max_num = 1000
	def __init(self, health, attack, speed): 
    	self.health = health
        self.attack = attack
        self.speed = speed
        Monster.max_num -= 1
    
    def move(self):
    	print("지상에서 이동")
        
def Wolf(Moster):
	pass				# 정의만 하고 싶을 때 pass 사용
		

def Shark(Moster):			# init 생성 가능 Moster와 Init 공유
	def move(self):			# 메서드 오버라이딩 : 메서드 재정의
    	print("헤엄치기")

class Dragon(Moster):

	#생성자 오버라이딩
	def __init__(self, name, health, attack):
    	super().__init__(name, health, attck) # 부모 클래스의 init 함수 불러와서 호출할 수 있음
    	self.skills = ("불","꼬리","날개")
        
	def move(self):
		print("날기")
	
    def skill(self):
    	print(f"스킬 사용했다 {self.skills[random.randint(0,2)}")

dragon = Dragon("드래곤", 800,80)
dragon.move()
dragon.skill()

 

 

Class 변수

- 인스턴스들이 모두 공유하는 변수 (클래스 모두 공유하는 변수)

- 만약 위 코드에서 wolf, shark 인스턴스를 생성해주고, wolf.max_num , shark.max_num 을 하나씩 호출해서 프린트한다면, -1씩 감소해서 출력 됨

 

 

Class  Underscore

 

_ : single underscore

 

- 내부적으로 사용하고, 외부에서 호출되선 안되는 변수 or 메서드

- 호출이 안되진 않음

 

__ : double underscore  # 외부에서 접근할 수 없음

 

- class __name # private class

- def __name # private 메서드

- __name # private 변수

 

__underscore__  # 특별한 변수 또는 함수에 사용

- 자세한건 참고 :https://corikachu.github.io/articles/python/python-magic-method