[개념] Chapter06-1 : 파이썬 클래스
카테고리: Python
인프런 강의 프로그래밍 시작하기 : 파이썬 입문을 듣고 정리한 내용입니다✏️
예제1
# 모든 Class는 object 상속를 받기 때문에
# class Dog(object): 라고도 쓸 수 있다. (object) 생략가능
class Dog:
# 클래스 속성
species = 'firstdog' # 클래스 변수
# 초기화/인스턴스 속성
def __init__(self, name, age):
self.name = name
self.age = age
# 클래스 정보
print(Dog) # <class '__main__.Dog'>
# 인스턴스화
a = Dog("mikky", 2)
b = Dog("baby", 3)
# 비교
print(a == b, id(a), id(b)) # False 140152368562288 140152368575344
#인스턴스화 된것은 다 다른 객체
# 네임스페이스 :객체를 인스턴스화 할 때 저장된 공간
print('dog1', a.__dict__) # dog1 {'name': 'mikky', 'age': 2}
print('dog2', b.__dict__) # dog2 {'name': 'baby', 'age': 3}
# 인스턴스 속성 확인
print('{} is {} and {} is {}'.format(a.name, a.age, b.name, b.age)) # mikky is 2 and baby is 3
# 각각 자신의 인스턴스에 속해있는 속성값들을 출력
if a.species == 'firstdog':
print('{0} is a {1}'.format(a.name, a.species)) # mikky is a firstdog
print(Dog.species) #firstdog
print(a.species) #firstdog
print(b.species) #firstdog
#클래스로도 바로 접근이 가능하과 인스턴스화 된 변수로도 접근이 가능하다.
-
클래스를 하나 만들어놓고 붕어빵을 찍어내듯이 사용이 가능하고 각각의 클래스는 공유하는 공간, 공유하는 속성, 나만의 공간을 보유하고 있다.
-
클래스 활용 장점
- 코드 재사용성 증가
- 불필요한 중복 방지 -> 깔끔한 코드
- 생산성 향상
- 성능 향상
클래스 활용을 통해 다음과 같은 장점들이 있다는 것이 객체지향의 핵심이다.
예제2
- self의 이해 : 인스턴스화된 대상
class SelfTest:
# 클래스 메소드
def func1():
print('Func1 called')
# 인스턴스 메소드
def func2(self):
print(id(self)) # id(f) 값과 같다.
print('Func2 called')
# __init__ 이 없어도 파이썬 내부적으로 알아서 실행
# 필요한 속성이 없기 때문에 안만듬
f = SelfTest()
print(id(f))
# f.func1() # f가 넘어가는데 func1에서 받질 않아서 에러 발생
f.func2()
SelfTest.func1() # 클래스 메소드 직접 호출
# SelfTest.func2() # self값을 받아야하는데 안 넣어줘서 에러
SelfTest.func2(f) # 인스턴스화 된 변수를 넣어 호출
- self가 없음 : 클래스 메소드 -> 클래스로 직접 호출 해야한다.
- self가 있음 : 인스턴스 메소드 -> 인스턴스를 넘겨주던가, 인스턴스로 호출을 해야한다.
예제3
- 클래스 변수, 인스턴스 변수
class Warehouse:
# 클래스 변수
stock_num = 0
def __init__(self, name):
# 인스턴스 변수
self.name = name
Warehouse.stock_num += 1
def __del__(self):
Warehouse.stock_num -= 1
user1 = Warehouse('Lee')
user2 = Warehouse('Cho')
print(Warehouse.stock_num) #2번 인스턴스화 시켰으니까 2가 나옴
print(user1.name) #Lee
print(user2.name) #Cho
print(user1.__dict__) # {'name': 'Lee'}
print(user2.__dict__) # {'name': 'Cho'}
print('before', Warehouse.__dict__)
print('>>>', user1.stock_num) # 2
del user1 # 인스턴스를 메모리에서 삭제
- user1의 네임스페이스를 봤을 때 stock_num이라는 것은 없음.
- 파이썬 내부적으로 인스턴스의 네임스페이스에 없으면 클래스의 네임스페이스를 알아서 확인해서 출력해준다. (클래스 네임스페이스에도 없으면 오류 발생)
예제4
class Dog:
# 클래스 속성
species = 'firstdog'
# 초기화/인스턴스 속성
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
return '{} is {} years old'.format(self.name, self.age)
def speak(self, sound):
return "{} says {}!".format(self.name, sound)
# 인스턴스 생성
c = Dog('july', 4)
d = Dog('marry', 10)
#메소드 호출
print(c.info()) #july is 4 years old
#메소드 호출
print(c.speak('Wal Wal')) # july says Wal Wal!
print(d.speak("Mung Mung")) # marry says Mung Mung!
- 클래스를 하나 만들었을 뿐인데 수 백 마리의 개를 여러 가지 종류로 인스턴스화 시켜서 각각 자기만의 정보를 가지고 있는 것을 구현
- speak 메소드 하나로 여러가지 말하는 방식을 출력 가능하다. (메소드 하나로 재사용이 가능하다.)
댓글남기기