- class 만드는 법을 순서대로 해본다.
- class 내부에서는 self를 붙여줘야 한다.
- class 설계 하다가 지금 당장 설계 못하는 부분은 pass로 우선 넣고 나중에 추가 해준다.
- 예시: def disp(self): pass
#1 만들어보기
순서
- class 선언
- class 내부에서 def __init__(self) 선언 (초기화, 즉 초깃값 설정)
- self: class 자기 자신을 의미
- class로 instance 만들기 (p = Person())
예시
class Person:
def __init__(self):
self.name = 'ddaeng' // 초기화
self.age = 20
p = Person()
print(p.name) // 'ddaeng'
print(p.age) // 20
#2 여러 개의 인스턴스 만들기
순서
- def __init__에서 name, age 매개변수 선언
- self.name, self.age는 name, age 매개변수 받아 주는 것으로 변경
- p1, p2 등 여러 개의 instance 선언
- 선언 할 때는 초깃값을 설정해준다.
예시
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('jake', 33)
p2 = Person('tom', 21)
print(p1.name) // 'jake'
print(p2.age) // 21
#3 class 내부에서 함수(메소드) 만들어보기
순서
- class 내부에 함수(메소드) 추가하기
- class 내부의 메소드를 만들 때는 def abc(self)와 같이 self 넣어주기
- class 밖에서 인스턴스 만들기
- 인스턴스 메소드 호출하기
예시
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def disp(self):
print(self.name, self.age)
p1 = Person('jake', 33)
p2 = Person('tom', 21)
p1.disp() // 'jake', 33
p2.disp() // 'tom', 21
#4 class 내부에서만 생성자에 접근하도록 하기
- 목적: 클래스 안에서만 접근 가능하도록 해서 보안을 유지한다.
순서
- 생성자 앞에 __를 붙인다.
- 메소드에서 __eng로 접근한다.
예시
class Person:
def __init__(self):
self.__name = 'ddaeng'
def getName(self):
print(self.__name)
def setName(self, name):
self.__name = name
p1 = Person()
p1.setName('great')
p1.getName() // 'great'
- 실제로 getter, setter 함수 형태로 많이 사용함
참고
- getter에 @property / setter에 @name.setter 데코레이터를 붙여주면 클래스 밖에서 name 으로 접근 가능 + 밖에서 접근할 때 getter / setter method 통해서 접근하게 된다.
class Person:
def __init__(self):
self.__name = 'ddaeng'
@property
def name(self):
print(self.__name)
@name.setter
def name(self, name):
self.__name = name
p1 = Person()
p1.name = 'dong'
- setter와 getter : https://wikidocs.net/21053
- [파이썬] property 사용법 (함수/데코레이터) : https://www.daleseo.com/python-property/
#6 class 상속 사용하기 - 생성자 상속
순서
- Person 클래스 만들기
- Person 클래스를 상속하는 Korean 클래스 만들기
- Korean 클래스 안에서는 부모의 __init__ 상속 받기
- Korean 클래스 안에서 부모의 __init__ 외에 추가 생성자 만들기
- 클래스 밖에서 인스턴스 만들기
- 인스턴스 메소드 실행 해보기
예시
class Person:
def __init__(self):
self.name = 'great'
self.age = 20
class Korean:
def __init__(self):
super().__init__()
self.lang = 'korean'
class American:
def __init__(self):
super().__init()
self.lang = 'english'
p1=Person()
print(p1.name, p1.age) // 'great', 20
k1=Korean()
print(k1.name, k1.age, k1.lang) // 'great', 20, 'korean'
a1=American()
print(a1.name, a1.age, a1.lang) // 'great', 20, 'english'
#7 class 상속 사용하기 - 메소드 상속
순서
- Person 클래스 만들기
- Person 클래스를 상속하는 Korean 클래스 만들기
- Person 클래스에서 method 만들기
- Korean 클래스에서 Person 클래스의 method 상속 받아서 method 만들기
- 클래스 밖에서 인스턴스 만들기
- 인스턴스 메소드 실행 해보기
예시
class Person:
def __init__(self):
self.name = 'great'
self.age = 20
def say(self):
print()
class Korean:
def __init__(self):
super().__init__()
self.lang = 'korean'
def say(self):
print('안녕하세요')
class American:
def __init__(self):
super().__init()
self.lang = 'english'
def say(self):
print('hello')
p1=Person()
p1.say()
k1=Korean()
k1.say() // '안녕하세요'
a1=American()
a1.say() // 'hello'
#8 class 상속과 다형성
순서
- 실행 할 main 함수 만들기
- main 함수 선언하기
- 부모가 될 Point class 만들기
- 자식이 될 Rect, Circle class 만들기 (Point class 상속 받아, 필요한 생성자와 함수 추가)
예시
class Point:
def __init__(self):
self.x = int(input('x='))
self.y = int(input('y='))
def disp(self):
pass
class Rect(Point):
def __init__(self):
super().__init__()
self.w = int(input('w=')) # width
self.h = int(input('h=')) # height
def disp(self):
print('사각형', self.x, self.y, self.w, self.h)
class Circle(Point):
def __init__(self):
super().__init__()
self.r = int(input('r=')) # radius
def disp(self):
print('원', self.x, self.y, self.r)
def main():
li=list()
while True:
s=input('1-사각형, 2-원, 3-조회, 4-종료: ')
if s == '1':
li.append(Rect())
if s == '2':
li.append(Circle())
if s == '3':
for i in li:
i.disp()
if s == '4':
break
print('프로그램을 종료합니다.')
main()
#9 class 변수와 instance 변수
- class 변수: 클래스 단위로 li = [] 관리(self를 안붙이고 선언). 인스턴스 생성 마다 초기화 X
- class명.li로 접근
- instance 변수: 각 인스턴스 별로 self.li = [] 초기화(self를 붙이고 선언). 인스턴스 생성 마다 초기화 O
- self.li로 접근
예시
# 인스턴스 변수: 각 인스턴스 별로 self.li = [] 초기화(self를 붙이고 선언). 인스턴스 생성 마다 초기화 O
class Person:
def __init__(self, sp):
self.li = [] # 인스턴스 변수
self.li.append(sp)
def disp(self):
print(self.li)
p1=Person('milk')
p1.disp() # ['milk']
p2=Person('coke')
p2.disp() # ['coke']
p3=Person('juice')
p3.disp() # ['juice']
# 클래스 변수 : 클래스 단위로 li = [] 관리(self를 안붙이고 선언). 인스턴스 생성 마다 초기화 X
class Person:
li = [] # 클래스 변수
def __init__(self, sp):
Person.li.append(sp) # Person class 내의 li에 접근
def disp(self):
print(Person.li)
p1=Person('milk')
p1.disp() # ['milk']
p2=Person('coke')
p2.disp() # ['milk', 'coke']
p3=Person('juice')
p3.disp() # ['milk', 'coke', 'juice']
- 출처: https://youtube.com/playlist?list=PLz2iXe7EqJOOt1r8Io-BFAV-SHFWFKYtN 를 요약 정리 했습니다.
'Python' 카테고리의 다른 글
python에서 yaml 파일 사용하기 (0) | 2022.01.18 |
---|---|
vscode에서 모듈 import 안될 때 (0) | 2021.08.20 |
댓글