코드와 결과물은 깃허브에 있습니다
파이썬 문서에서 강조하고 한번 더 강조하는 문구가 있다
This is so important that I'm going to repeat it in case you missed it the first few times: everything in Python is an object. Strings are objects. Lists are objects. Functions are objects. Even modules are objects.
이러한 파이썬을 100% 활용하기 위해서는 객체에 대한 이해도가 높을 수록 유리하다
id 함수
사람이 주민번호를 가지고 있듯이 객체 고유의 번호를 확인할 수 있다
얕은 복사와 깊은 복사
list1에 값을 추가했지만 list2에도 값이 생긴 것을 볼 수 있다
이에 대한 이해가 없이 본다면 파이썬 언어가 이상하다고 생각할지도 모른다
얕은 복사와 깊은 복사에 대한 간단 정의
보통의 사람이 생각하는 복사는 깊은 복사에 해당할 듯 하다
프로그래밍 방법론
클래스 객체와 호출 할때마다 달라지는 객체의 차이
클래스와 함수의 작명 규칙
클래스 : 카멜 케이스, 명사위주로 ex) Camel Case
함수 : 스네이크 케이스, 동사위주로 ex) snake_case
클래스만의 변수, 속성
class Car:
'''class attributes tells us the state of class'''
color = 'red'
category = 'sports car'
'''drive start'''
def drive(self):
print("I`m driving")
'''accelate'''
def accel(self, speed_up, current_speed=10):
self.speed_up = speed_up
self.current_speed = current_speed + speed_up
print("speed up", self.speed_up, "driving at", self.current_speed)
다음과 같은 클래스가 있을때 클래스의 속성에 해당하는 color, category
메서드에 있는 self의 역할
self는 아래와 같은 형태의 역할을 자동으로 해주게 만들어져있다
아래와 같이 코드를 작성하는 것은 동작에 대한 예시일 뿐 따라해선 안된다
self가 없을 때 일어나는 일
인자를 받지 않는 것으로 코드했지만 self가 인자로 들어간 것을 확인할 수 있다
클래스와 인스턴스의 속성을 구분하지 못하면 생기는 일
class Test2:
def run1(self, a):
self.a = float(a) * 10
print(self.a)
def run2(self, b):
b = float(b) * 10
print(self.b)
t = Test2()
t.run1(1)
# 10
t.run2(1)
self.변수는 인스턴스, 그냥 변수는 클래스의 속성이 된다 명확한 구분과 사용이 필요하다
예시)
class Car:
Manufacture = "India"
def __init__(self, color, category="sedan"):
self.color = color
self.category = category
생성자(Constructor)
클래스 내에 다음과 같은 구조를 가지고 있다
def __init__(self):
self.data = []
생성자 사용시의 활용
# Car class with constructor
class Car2:
def __init__(self, color, category):
self.color = color
self.category = category
def drive(self):
print("I`m driving")
def accel(self, speed_up, current_speed=10):
self.speed_up = speed_up
self.current_speed = current_speed + self.current_speed
print("speed up", self.speed_up, "driving at", self.current_speed)
car2 = Car2('yellow', 'sedan')
car2.color
# 'yellow'
함수처럼 디폴트 값을 줄 수도 있다
# default value is possible like function
class Car2:
def __init__(self, color='red', category="sports car"):
self.color = color
self.category = category
클래스의 상속
다음과 같은 클래스가 있을 때
class Car:
Manufacture = "India"
def __init__(self, color='red', category='sedan'):
self.color = color
self.category = category
def drive(self):
print("I`m driving")
def accel(self, speed_up, current_speed=10):
self.speed_up = speed_up
self.current_speed = current_speed + self.speed_up
print("speed up", self.speed_up, "driving at", self.current_speed)
상속만 받으면 단 몇줄로도 클래스를 가져올 수 있다
# new class with no code
class NewCar(Car):
pass
socar = NewCar()
socar.drive()
socar.accel(10)
# I`m driving
# speed up 10 driving at 20
필요한 속성만 추가해서 사용하는 것도 가능하다
# just class attribute change
class NewCar(Car):
maker = "Porsche"
sportscar = NewCar()
sportscar.maker
상속이 주로 쓰이는 3가지
- 메서드 추가하기
- 메서드 오버라이드
- Super class 호출하기( super() )
메서드 추가하기
# add method
class NewCar(Car):
def autonomous_drive(self):
print("Autonomous driving is on")
메서드 오버라이드
# override method
class NewCar(Car):
def drive(self):
print("even drive is auto")
슈퍼클래스 사용하기
# call super class, super class`s changed value will be affected to subclass
class NewCar(Car):
def __init__(self, color, category, maker):
super().__init__(color, category)
self.maker
def autonomous_drive(self):
print("Autonomous driving is on")
def accel(self, speed_up, level=1, current_speed=10):
self.boost[level] = {1 : 0, 2 : 30, 3 : 50}
self.speed_up = speed_up + self.boost[level]
self.current_speed = current_speed + self.speed_up
print("speed up", self.speed_up, "driving at", self.current_speed)
단순 기능의 상속 뿐만 아니라 부모 클래스의 필요한 속성을 가져와 사용할 수 있다
특히 변경되는 속성이더라도 알아서 가져오기 때문에 하드코딩 하지 않아도 된다
'23년 이전 글 > 모두의연구소 아이펠' 카테고리의 다른 글
- 13일차 - Cat vs Dog classification (0) | 2022.01.12 |
---|---|
- 12일차 - 너의 얼굴은( Object Detection) (0) | 2022.01.11 |
-10일차- Machine Learning과 Scikit-Learn (0) | 2022.01.07 |
-9일차- Machine Learning Classification Task (0) | 2022.01.06 |
-8일차- 데이터 시각화 (0) | 2022.01.05 |