본문 바로가기
python

[python]파이썬 - 클래스class

by skysline 2023. 1. 24.
반응형

클래스(Class

  • 변수와 함수를 묶어놓은 개념
  • 클래스는 객체(데이터와 기능을 갖고있는..)를 만들기 위한 설계도
  • 클래스를 메모리에 객체화 하면 그걸 인스턴스(instance)라고 한다.
 

클래스의 구조

  • 변수: 인스턴스 변수(객체화되면 사용가능한 변수) , 클래스 변수(클래스 정의시 에도 사용가능한 변수)가 있다.
  • 함수: 메소드(객체의 소속되어있는 함수)
  • __init__ 메소드: 생성자
    • 객체의 초기화를 담당, 객체의 변수의 값을 초기 설정
    • 객체화가 되었을때 생성해야하거나 초기값을 세팅해야하는 인스턴스 변수들이 있다면 __init__ 메소드 안에 선언(정의)하면 된다.
 

클래스 정의 하는 방법

class <ClassName>: #pascal case, upper camel case
    def __init__(self):
        code context
        ...
    def <method_name>(self):
        code context
        ...
 
 
 
class PlayerCharacter:
    def __init__(self,hp,exp):
        self.hp = hp
        self.exp = exp
 
 
 
player1 = PlayerCharacter(100,0)
player2 = PlayerCharacter(200,50)

player1.hp , player1.exp , player2.hp, player2.exp
 
(100, 0, 200, 50)
 

self

  • 클래스가 객체화 되었을때 자기 자신의 주소를 받는 파라미터
  • 클래스가 인스턴스화 되면 메모리상에서 어디에 있는지 self 파라미터의 주소값을 참조해서 객체의 변수의 접근한다.
  • 클래스를 정의할때 메소드에 무조건 첫번째 파라미터로 정의해줘야한다.
  • 클래스가 객체화 되었을때 메소드 사용시 아규먼트로 넣어주지 않아도 자동으로 들어간다.
 
  • self 는 자동으로 들어가기 때문에 인자로 넣어주려 하면 에러가 발생한다.
 
 
 
PlayerCharacter("Ox12313",100,0)
 
 
 
  • 변수에 넘어가는 주소값은 self가 갖고 있는 주소값이다.
 
 
class MyClass:
    def __init__(self):
        print(id(self))
 
 
 
 
mc = MyClass()
 
140293264169104
 
 
 
id(mc)
 
140293264169104
 
 
class PlayerCharacter:

    def attack(self):
        print("공격하기")
        self.exp += 2 # self.exp = self.exp + 2 

    def set_exp(self,exp):
        self.exp = exp
 
 
 
 
player = PlayerCharacter()

player.set_exp(10)
player.exp
 
10
 
 
 
player.attack()
player.exp
 
공격하기
12
 
  • 클래스에 생성자가 없고, set_exp 메소드를 실행하지 않았고, self.exp 인스턴스 변수가 생성되지 않아 에러가 발생한 예시
 
 
 
player = PlayerCharacter()
player.attack()
 
 
 

우선 외우자

  • 클래스를 정의할때 __init__ 를 무조건 정의하자
    • 객체화 되었을때 사용할 변수들을 이안에 정의해주자.
  • 클래스 안에 메소드(__init__ 포함)들을 정의할때는 무조건 첫번째 파라미터로 self 를 정의해주자.
  • 클래스가 객체화되서 해당 객체의 메소드를 실행때는 self 는 자동으로 파이썬이 넣어주니까 신경쓰지 말자.
 
 
class PlayerCharacter:
    def __init__(self,hp,exp): # 객체화 되면 자동으로 실행됨
        self.hp = hp # 인스턴스 변수 선언됨
        self.exp = exp # 인스턴스 변수 선언됨

    def attack(self): # 메모리에 생성된 인스턴스 위치에 변수나 메소드에 접근하기 위해 self 받는 것이다.
        print("공격하기")
        self.exp += 2 # 인스턴스 변수에 접근하려면 self 를 참조해야한다.
    
    def defend(self):
        print("방어하기")
        self.exp = self.exp + 1

    def attacked(self,attack_size):
        print("공격 받음")
        self.hp = self.hp - attack_size
    
 
 
 
 
player1 = PlayerCharacter(100,0)
player2 = PlayerCharacter(120,10)
 
 
 
 
player1.attack()
player1.defend()
player1.attacked(3)
 
공격하기
방어하기
공격 받음
 
 
 
player2.attack()
player2.attack()
player2.attack()
player2.attacked(10)
 
공격하기
공격하기
공격하기
공격 받음
 
  • 인스턴스 변수의 값 확인하기
 
 
 
player1.hp
 
97
 
  • 인스턴스 변수 수정하기
 
 
 
player1.hp = 20
 
 
  • 클래스 변수(참고용)
 
 
 
class PlayerCharacter:
    character = "Wizard"     
    def __init__(self,hp=100,exp=0):
        self.hp = hp
        self.exp = exp
 
 
 
 
PlayerCharacter.hp # 객체화 되지 않았기 때문에 인스턴스 변수인 hp 참조 불가
 
 
 
 
 
PlayerCharacter.character # 클래스 변수는 객체화 되지 않아도 참조 가능!
 
 
 
  • 클래스가 객체화 될때 서로 다른 객체가 동일하게 공유해야하는 변수의 값이 있다면 클래스 변수를 이용한다.(참고만 하시오.)
 
 
 
player1 = PlayerCharacter()
player2 = PlayerCharacter(200,20)

player1.character, player2.character
 
('Wizard', 'Wizard')
 
  • 클래스 메소드(참고용)
    • 객체화 하지 않아도 사용 가능한 메소드
 
 
class PlayerCharacter:
    character_type = "Wizard"

    @classmethod
    def print_character_type(cls): # 클래스의 주소를 받는 첫번째 파라미터를 cls 라고한다.
        print(cls.character_type)
        
PlayerCharacter.print_character_type()
 
Wizard
 
  • 다음과 형태로 프로그램에 여러 상수를 하나의 객체로 관리하고자 할때 사용하는 예시(참고용)
 
 
class CFG:
    train_data_path = "/data/train/"
    test_data_path = "/data/test/"
    model_name = "deep_model"
 
 
 
 
CFG.model_name
 
 
 
 
def preprocess(cfg):
    pass
preprocess(CFG)
 
 
Wizard 클래스를 만들어주세요
인스턴스 변수: hp , exp , mp
메소드:
    attack: 공격하기 출력과 함께 exp 가 5씩 증가
    defend: 방어하기 출력과 함께 exp 가 1씩 증가
    attacked: 공격받은 사이즈를 인자로 받아 공격받음 출력과 함께 hp 를 공격받은 사이즈 만큼 감소
    magic_skill: mp 가 3씩 감소
 
 
 
class Wizard:
    def __init__(self,hp,exp,mp):
        self.hp = hp
        self.exp = exp
        self.mp = mp

    def attack(self):
        print("공격하기")
        self.exp += 5

    def defend(self):
        print("방어하기")
        self.exp += 1
    def attacked(self,attack_size):
        print("공격 받음")
        self.hp = self.hp - attack_size

    def magic_skill(self):
        self.mp -= 3
 
 
 
player = Wizard(100,50,50)
player.attack()
 
공격하기
 
Car 클래스에 차종, 색깔, 차번호를 받아 인스턴스 변수를 초기화하는 클래스를 만드세요.

ex)
morning = Car("모닝", "Blue", 1234)
print(morning.name)
print(morning.color)
print(morning.num)

Output:
모닝
Blue
1234
 
 
class Car:
    def __init__(self,name,color,num):
        self.name = name
        self.color = color
        self.num = num
 
 
 
morning = Car("모닝","blue",1234)
print(morning.name)
 
모닝
 
Car 클래스에 담긴 인스턴스 변수들을 수정할 수 있는 set_info() 메소드를 만들어주세요.
info() 메소드를 만들어서 차종, 색깔, 번호를 출력해주는 메소드도 만들어주세요.
ex)
morning = Car("모닝", "Blue", 1234)
morning.set_info("렉서스", "Red", 1004)    
morning.info()

Output:
차종: 렉서스, 색깔: Red, 번호: 1004
 
 
 
class Car:
    def __init__(self,name,color,num):
        self.name = name
        self.color = color
        self.num = num

    def set_info(self,name,color,num):
        self.name = name
        self.color = color
        self.num = num

    def info(self):
        print(f"차종: {self.name} , 색깔: {self.color}, 번호: {self.num}")
 
 
 
 
morning = Car("모닝", "Blue", 1234)
morning.set_info("렉서스", "Red", 1004)    
morning.info()
 
차종: 렉서스 , 색깔: Red, 번호: 1004
 
다음과 같은 형태의 리스트를 입력받고 , key 이름들을 리스트로 입력 받아 dict 자료형을 생성하는 클래스를 만드시오

ex)
class DictDataset:
    code context


data = [
        [1,2,3,4,5,6,7,8,9],
        [10,20,30,40,50,60,70,80,90]
]

dict_dt = DictDataset(data,["col1","col2"])
dict_dt.dataset
Ouput:
{'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9],
 'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90]}
 
 
class DictDataset:
    def __init__(self,lst,keys):
        # self.dataset = dict(zip(keys,lst))
        self.dataset = self.trans_dict(lst,keys)
    def trans_dict(self,lst,keys):
        tmp = {}
        for k,v in zip(keys,lst):
            tmp[k] = v
        return tmp

data = [
        [1,2,3,4,5,6,7,8,9],
        [10,20,30,40,50,60,70,80,90]
]
keys = ["col1","col2"]
dict_dt = DictDataset(data,keys)
dict_dt.dataset
 
{'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9],
 'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90]}
 
위에 구현한 클래스에서 추가 메소드를 작성하시오
head 메소드와 tail 메소드를 작성하세요 
head 메소드의 경우 인자값이 없을경우 dict의 모든 value의 앞에서 5개의 값들이 key 와 함께 dict 형태로 리턴되게 하세요 
tail 메소드의 경우 인자값이 없을경우 dict의 모든 value의 뒤에서 5개의 값들이 key 와 함께 dict 형태로 리턴되게 하세요.
(역순으로 출력되는 것이 아님)
head , tail 모두 인자값이 주어질경우 인자값 개수만큼 value가 나오게 한다.
(1 이상 인자값을 받는다는 가정을 하기 때문에 조건문으로 체크 안해도 됩니다.)

ex)
class DictDataset:
    def __init__(self,lst,keys):
        self.dataset = dict(zip(keys,lst))
    def head():
        pass
    def tail():
        pass
dict_dt = DictDataset(data,["col1","col2"])
dict_dt.head()
Output:
{'col1': [1, 2, 3, 4, 5], 'col2': [10, 20, 30, 40, 50]}

dict_dt.head(3)
Output:
{'col1': [1, 2, 3], 'col2': [10, 20, 30]}

dict_dt.tail()
Output:
{'col1': [5, 6, 7, 8, 9], 'col2': [50, 60, 70, 80, 90]}

dict_dt.tail(3)
Output:
{'col1': [7, 8, 9], 'col2': [70, 80, 90]}
 
 
 
{'col1': [1, 2, 3, 4, 5, 6, 7, 8, 9],
 'col2': [10, 20, 30, 40, 50, 60, 70, 80, 90]}
 
 
 
 
{'col1': [1, 2, 3, 4, 5],
 'col2': [10, 20, 30, 40]}
 
 
 
 
class DictDataset:
    def __init__(self,lst,keys):
        self.dataset = dict(zip(keys,lst))
    def head(self,n = 5 ):
        result = { k:v[:n] for k,v in self.dataset.items() }
        return result
    def tail(self,n = 5):
        result = { k:v[-n:] for k,v in self.dataset.items() }
        return result

data = [
        [1,2,3,4,5,6,7,8,9],
        [10,20,30,40,50,60,70,80,90]
]
keys = ["col1","col2"]
dict_dt = DictDataset(data,keys)

dict_dt.tail(3)
 
{'col1': [7, 8, 9], 'col2': [70, 80, 90]}
 
  • 초기 숫자 하나를 받아서 객체로 생성하는 클래스를 만드세요.
 
 
 
class Calculator:
    def __init__(self,n):
        self.result = n

    # self.result 변수에 인자값을 더해서 다시 self.result 변수에 저장해주는...
    def add(self,n):
        self.result = self.result + n
    
    def sub(self,n):
        self.result = self.result - n

    def mul(self,n):
        self.result = self.result * n

    def div(self,n):
        if n:
            self.result = self.result / n

    def get_result(self):
        # n = int(self.result)
        n = int(self.result)
        return n 
 
 
구현한 클래스에서 추가 메소드를 작성하시오
rename 메소드를 작성하세요 
딕셔너리를 입력 받아 인스턴스 변수인 dataset의 key를 변경하는 메소드를 작성하세요.

ex)
dict_dt = DictDataset(data,["col1","col2"])
keys_rename = {
    "col1" : "num1",
    "col2" : "num2"
}
dict_dt.rename(keys_rename)
dict_dt.dataset
Output:
{'num1': [1, 2, 3, 4, 5, 6, 7, 8, 9],
 'num2': [10, 20, 30, 40, 50, 60, 70, 80, 90]}
 
 
 
class DictDataset:
    def __init__(self,lst,keys):
        self.dataset = dict(zip(keys,lst))
    def head(self,n = 5 ):
        result = { k:v[:n] for k,v in self.dataset.items() }
        return result
    def tail(self,n = 5):
        result = { k:v[-n:] for k,v in self.dataset.items() }
        return result

    def rename(self,keys):
        for k,v in keys.items():
            self.dataset[v] = self.dataset.pop(k)        
 
 
 
 
dict_dt = DictDataset(data,["col1","col2"])
keys_rename = {
    "col1" : "num1",
    "col2" : "num2"
}
dict_dt.rename(keys_rename)
 
 
 
 
dict_dt.dataset
 
{'num1': [1, 2, 3, 4, 5, 6, 7, 8, 9],
 'num2': [10, 20, 30, 40, 50, 60, 70, 80, 90]}
 
 
 
a = 3 
b = 2
b
a
 
3
 
 
 
print(a)
 
3
 
  1
  2
a = "철수\n민수"
a
 
 
 
 
철수
민수
 
 
 
 
None
 
 
반응형

'python' 카테고리의 다른 글

[python]파이썬 - 오류 예외처리  (0) 2023.01.24
[python]파이썬 - 클래스class2  (0) 2023.01.24
[python]파이썬 - 함수function2 lambda  (0) 2023.01.24
[python]파이썬 - 함수function  (0) 2023.01.24
[python]파이썬 - 제어문  (0) 2023.01.24

댓글