일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 씨본
- 로지스틱회귀
- seaborn
- AND게이트
- numpy
- 선형회귀
- 우분투
- linux
- 크롤링
- 판다스
- 달의조각
- 데이터시각화
- DataFrame
- 비지도학습
- NAND게이트
- XOR게이트
- 퍼셉트론
- 데이터프레임
- python
- 데이터분석
- 딥러닝
- 파이썬
- pandas
- ubuntu
- 머신러닝
- 데이터크롤링
- Perceptron
- 리눅스
- OR게이트
- Deeplearning
- Today
- Total
Charming ['ㅡ'] Ham !
Python | 클래스 기본 문법 본문
객체 지향 프로그레밍¶
객체를 활용하는 프로그래밍을 의미
1. 객체란?¶
파이썬에서 '객체' 는 변수에 할당 될 수 있고, 함수의 인자로 할당될 수 있는 것들이며, 파이썬에서는 모든것이 변수에 할당 및 함수의 인자가 될 수 있기때문에 모든 것이 '객체' 로 볼 수 있다.
속성
은 상태
를 나타내며, 메소드
는 동작
을 나타낸다. 객체의 속성
은 변수
로 구현되며, 메소드
는 함수
로 구현된다.
변수¶
변수란 데이터를 담은 객체를 부를 이름을 붙여주어 참조할 수 있게하는 것이다. 친구들을 부를때, 이름 혹은 별명으로 부르듯이 변수란 데이터를 지칭하는 이름일 뿐이며, 별명이 바뀔 수 있듯이 변수명도 바뀔 수 있다.
얕은 복사, 깊은 복사¶
얕은 복사는 copy.copy()
의 서식으로 사용되며, 원본 객체의 주소만을 복사한다.
깊은 복사는 copy.deepcopy()
의 서식으로 사용되며, 원본 객체의 값을 복사한다.
클래스 (class)¶
객체를 직접 설계하기 위해서 class
를 사용하며, 기본 사용 서식은
class Myclass :
pass
와 같다. class 는 class 선언을 위한 키워드이며, Myclass 는 설계할 클래스의 이름, 그리고 클래스의 이름과 뒤에 콜론( : ) 을 붙여주어 사용하며 pass 부분에는 본문으로 클래스에 대한 내용이 들어가게 된다.
클래스사용 - 객체 인스턴스화¶
클래스를 사용하기위해 클래스의 객체화가 필요하다. 이 과정을 인스턴스화 라고하며, 선언한 클래스 이름에 괄호를 적어 생성된 인스턴스를 변수에 할당해서 사용한다.
위에서 변수를 사용한 것과 같은데 어떠한 값 대신 그 자리에 클래스를 넣어 사용하는 것이다.
예를들어 Car() 라는 클래스를 만들었었다면, car1 = Car()
처럼 사용하는 것이다.
표기법¶
-
클래스명 표기법
- 카멜케이스 : 각 단어의 앞글자를 대문자로 쓸 것.
-
함수명 표기법
- 스네이크 케이스 : 단어는 소문자로 쓰고 각 단어의연결은 언더바(_) 를 사용할 것.
-
주로 클래스명은 명사로, 함수명은 동사로 사용한다.
클래스의 기본 문법 (클래스 속성 / 메소드)¶
다음과 같은 클래스를 만들어 봅시다.
색상은 빨강, 차종은 스포츠카 라는 속성을 가지고 주행과 가속이라는 동작을 갖는 클래스
- 메소드
- 함수선언은
def
를 통해 사용한다. - 함수의 첫번째 인자는
self
를 사용한다. - 주행은
drive()
라는 메소드를 사용하며,self
만을 인자로 갖는다. - 가속은
accel()
라는 메소드를 사용하며,현재속도와 가속할 값
을 인자로 받는다.- 현재속도 인자 :
current_speed
- 가속 인자 :
speed_up
- 현재속도 인자 :
accel
메소드에self.speed_up
,self.current_speed
를 인자로 준다.
- 함수선언은
# Car 클래스 선언
class Car :
# 속성 = 클래스의 상태, 변수로 사용
color = 'red'
categoey = 'sports car'
# 메소드 = 클래스의 동작, 함수로 사용
def drive (self) :
# 주행 메소드
print("I'm driving")
# 함수의 첫번째 인자는 self 를 사용
def accel(self, speed_up, current_speed = 10) :
# 가속메소드
# : param speed_up : 가속
# : param current_speed : 현재 속도
# : type speed_up :string
# : type current_speed : string
self.speed_up = speed_up
self.current_speed = current_speed + speed_up
print('speed up', self.speed_up, "driving at", self.current_speed)
클래스의 속성과 메소드의 사용¶
클래스 속성에 접근¶
클래스의 속성을 사용하기 위해서는 인스턴스 객체 혹은 클래스명+ 점 (.) + 속성명
의 서식을 통해 사용한다.
위 클래스를 통해 보면 Car().color
로 접근할 수 있다. 인스턴스 객체를 통해 적용해보면 다음과 같이 사용 가능하다.
mycar = Car()
mycat.color
클래스 메소드 사용¶
속성에 접근하는 것과 동일하다. 인스턴스 객체 혹은 클래스명 + 점 (.) + 메소드 (함수)
의 서식을 통해 사용한다.
즉, Car().drive()
를 통해 사용할 수 있으며, 해당 함수에서 인자였던 self
는 생략이 가능하다.
하지만 Car().accel()
을 호출하려한다면, 인자를 모두 생략할 수 없다. accel
에는 총 3개의 인자가 있는데, self
인자는 생략이 가능하다고 위에서 하였다. 그럼 speed_up
, current_speed = 10
인자 중에서 current_speed
인자는 현재의 속도를 말해주는 인자이기 때문에 가속을 의미하는 accel
함수에서는 해당 인자를 바꿔줄 필요가 없다. 즉, speed_up
인자만을 적어주면되는데 다음과 같이 사용이 가능하다.
Car().accel(5)
출력 값은 current_speed 인 10 + 5 가 되어 speed up 5 driving at 15
로 출력된다.
Cat().accel(5)
는 위의 인스턴스 객체를 활용해 mycar.accel(5)
로 사용할 수 있으며, 주로 인스턴스 객체를 통해 많이 활용된다.
접두사 self¶
클래스 메소드를 정의할 때 self
인자를 사용하지 않으면 에러가 발생하게된다.이와 같은 이유로 인스턴스 속성으로 사용하고 싶은 변수는 self
인자를 꼭 써주어야 한다.
이는 self
를 통해 객체 안에서 인스턴스 객체를 나타낼 수 있게된다.
mycar = Car()
를 통해 Car()
클래스를 인스턴스화 하여 mycar
로 호출 하였듯이, 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)
t.run2(1)
위 예에서 t.run1(1)
은 정상적으로 출력이되지만, t.run2(1)
은 에러가 난다. 이는 함수 메소드세어 self.b
를 통해 인스턴스화 해주지 않았기 떄문이다.
self 에 대해서 요약하자만 다음과 같다.¶
- self 는 자시 자신
- 클래스에 의해 생성된 인스턴스 객체를 지칭
- 클래스의 메소드로 인자 self 를 받아야한다.
- 메소드를 호출할 때 self 를 전달하지 않는다.
- 인스터느 변수를 정의할 때는 self 를 붙여주어야 한다. (위의 t.run2(1) 이 에러가 나는 이유)
생성자 __init__
¶
클래스에 의해 만들어진 인스턴스 객체의 속성값을 초기화할 때 생성자
를 사용하게 된다.
예를들면 다음과 같다.
class Car2:
# __init__ : 메소드 안에 인자를 전달함으로써 인스턴스 객체의 속성을 초기화
# __init__ 또한 함수로 생성해야 한다. (첫번째 인자로 self 를 받아야 한다.)
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.speed_up
print("speed up", self.speed_up, "driving at", self.current_speed)
위 클래스에서 처음 클래스와 달리 색상과 차종을 __init__
생성자를 통해 초기화하였다.
이 클래스를 car2 = Car2('yellow, 'sedan')
로 인스턴스 객체화 시켜주고, car2.color
를 통해 호출해보면 yellow 라는 출력 값이 나타난다.
Car2('yellow, 'sedan')
을 입력해주는 이유는, 맨 처음 Car
클래스와 달리 색상과 차종의 인자 값이 지정되어 있는 상태가 아니기 때문이다. 생성자 __init__
을 통해 초기화 (백지상태) 가 되었으므로, 인자를 입력해준 것이다.
아래와 같이 처음부터 색상과 차종의 인자를 지정할 수도 있다.
class Car2:
def __init__(self, color='red', category='sprots car'):
self.color = color
self.category = category
-
생성자
__init__
을 요약하자면 다음과 같다. -
__init__
이라 쓰고,던더(Double Under) 이닛
이라 읽는다. - 파이썬의 생성자는 초기화 작업만 수행한다.
- 객체 인스턴스화는 클래스 사용시 변수 할당을 통해 이루어진다.
- 생성자와 같이 앞에 언더바 2개 (
__
) 가 있는 것을매직 메소드
라 한다.
클래스 변수와 인스턴스 변수¶
클래스 내부에서 변수를 선언하는 방벙 2가지가 있는데, 일반적으로 변수를 사용하는 것과 동일하게 변수명 = 값
형태로 사용이 가능하다.
다른 하나의 방법은 위에서 설명한 생성자
를 활용하는 것이다.
예를 들면 다음과 같다.
class Car:
Manufacture = "India"
def __init__(self, color, category='sedan'):
self.color = color
self.category = category
car1 = Car('red','sports car')
car2 = Car('white')
print(car1.Manufacture, car1.color, car1.category)
print(car2.Manufacture, car2.color, car2.category)
위 예에서 Manufacture 는 클래스 변수라고 하며, color, category 와 같은 변수를 인스턴스 변수라고 한다.
-
클래스변수
- 클래스에서 선언된 변수 (속성) 을 지칭한다.
- 모든 객체에서 같은 값을 조회 (위 예시에서는 India 라는 값으로 지정되어 있기 때문)
- 위 예에서 클래스 변수는 car1 와 car2 가 공유한다.
-
인스턴스 변수
- init 을 통해 self 를 사용해 선언된 변수를 지칭한다.
- 객체가 인스턴스화 될 때마다 새로운 값이 할당된다.
- 위 예에서 color, category 가 인스턴스 변수가 된다.
- 다른 객체 간 값을 공유할 수 없다. (위 예에서 car1 와 car2 가 다른 값을 가지는 것과 같다)
-
객체 단위로 변경되어야 하는 변수는 인스턴스 변수로 선언해야 한다!!
클래스의 상속¶
기존 클래스에서 몇개의 메소드 기능만 추가하고자 할 때 주로 사용된다. 즉, 앞서 만들어진 클래스를 가져오는 것이다.
위에서 만든 클래스를 다시한번 가져와 보자
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)
해당 클래스에 maker
라는 메소드만 추가된 NewCar
라는 클래스를 만든다고 한다면 상속
을 이용한다.
상속은 class 새로운 클래스명(상속받을 클래스명)
의 서식으로 사용한다. 즉,
clss NewCar(Car) :
pass
와 같이 사용할 수있다.
이를 인스턴스 변수화 해서 실행해보면
car = NewCar()
car.drive()
car.accel(10)
새로운 클래스명인 NewCar
에서도 Car
클래스의 기능을 그대로 사용할 수 있다. 여기서 새로운 maker
메소드를 추가한다면 다음과 같다.
class NewCar(Car):
maker = 'Porsche'
car = NewCar()
car.maker
이렇게 상속을 통해 새로 만들어진 클래스를 자식 클래스 / 파생된 클래스 / 서브 클래스
, 상속한 클래스를 부모 클래스 / 슈퍼 클래스 / 베이스 클래스
라 한다.
3가지 상속 사용법¶
1. 메소드 추가하기 (add)¶
메소드 추가하기는 방금 위에서 maker
메소드를 추가한 것과 동일하다.
2. 메소드 오버라이드는¶
기존의 메소드를 변경하는 것을 말한다.
class NewCar(Car):
def fly(self):
print("I'm flying!! This is the new car!!")
def drive(self):
print("I'm driving and can fly")
car1 = NewCar()
car1.drive()
앞서 생성된 Car
클래스에서 drive
메소드는 "I'm driving" 라는 구문이 출력하게 만들어졌었다. 하지만 Newcar
클래스에서 Car
클래스를 상속 받아 동일한 메소드인 drive 메소드를 다시 정의해주면 새로 정의된 메소드가 호출된다.
3. 부모 메소드 호출하기 (super())¶
super()
라는 함수를 사용하며, 자식 클래스에서 부모 클래스의 메소드를 호출할 때 사용된다.
def 클래스 명(부모클래스 명):
super().메소드이름()
위와 같은 서식으로 사용되며, 부모 클래스의 변경사항을 자식 클래스에 그대로 반영하고 싶을 때 사용한다.
예를 들면
class Car:
Manufacture = "India"
def __init__(self, color='red', category='sedan'):
self.color = color
self.category = '2020Y '+ category
class NewCar(Car):
def __init__(self, color, category, maker):
super().__init__(color, category)
self.maker = maker
def fly(self):
print("I'm flying!! This is the new car!!")
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)
즉, 부모 클래스에서 변경된 사항들을 전부 상속 받아 상속 클래서으세 사용할 수 있게 한다.
'지식 정보 공유 > etc' 카테고리의 다른 글
Python | Multiprocessing (멀티프로세싱) (0) | 2021.02.02 |
---|---|
Python | Generator (제너레이터) (0) | 2021.02.01 |
머신러닝 알고리즘 (1) | 2021.01.24 |
Ubuntu (18.04) Terminal Commands / 우분투 터미널 명령어 모음집 (0) | 2021.01.18 |
가상환경 설정 및 주피터노트북 설치 (0) | 2021.01.08 |