반응형
클래스(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 |
댓글