[Python] 클래스(class)

Jeongyun Heo·2020년 12월 28일
0

Python

목록 보기
16/36
post-thumbnail

노마드 코더 Python으로 웹 스크래퍼 만들기
https://nomadcoders.co/python-for-beginners

점프 투 파이썬
https://wikidocs.net/28

📔  클래스 만드는 방법

  1. class 입력
  2. 대문자로 시작하는 클래스의 이름 작성
  3. 안에 들어갈 함수, 변수 설정

객체(인스턴스) 만드는 방법
객체 = class이름()

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

print(Car)

👉  <class '__main__.Car'>

Car class로 porche라는 instance를 만든다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

porche = Car()  # porche는 Car class의 instance

porche를 출력해본다.
print(porche)

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

porche = Car()

print(porche)  # porche를 출력해본다.

👉  <__main__.Car object at 0x7f0b604d2640>

Car object 라고 나온다.

porche는 Car에 있는 것들을 쓸 수 있다.

porche.windows

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

porche = Car()

print(porche.windows)

👉 4

porche(객체)에 객체변수를 추가로 생성해 줄 수 있다.
※ 객체에 생성되는 객체만의 변수를 객체변수라고 부른다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

porche = Car()
porche.color = "Red" # 새로운 객체변수 color 생성 

print(porche.color) # 새로운 객체변수 출력

👉 Red # 잘 나온다

Car class로 다른 차도 만들 수 있다.
(무수히 많은 객체를 만들어 낼 수 있다.)

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

porche = Car()
porche.color = "Red"

ferrari = Car() # Car class로 만든다.

ferrari(객체)에 변수를 추가로 입력해 줄 수 있다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

porche = Car()
porche.color = "Red"

ferrari = Car()
ferrari.color = "Yellow"  # ferrari에 새로운 변수 추가

print(ferrari.color)  # 새로 추가한 변수 출력

👉 Yellow  # 잘 나온다.

📔  Method (메서드)

🔹  function과 method의 차이

function은 클래스 밖에 단독으로 있다.
function

method는 클래스 내부에 있는 함수다.
method

🔹  method 정의, 호출

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

    def start():  # 괄호 안에 매개변수 입력 안 함
        print("I started")

porche = Car()
porche.color = "Red Sexy Red"
porche.start()  # 인수 없이 start 메서드 호출

👉  # 오류 남
Traceback (most recent call last):
  File "main.py", line 12, in <module>
    porche.start()
TypeError: start() takes 0 positional arguments but 1 was given

start 메서드의 매개변수는 0개인데 인수를 1개 받아서 오류가 났다고 나온다.
나는 인수를 입력하지도 않았는데 1개는 어디서 나온 걸까

모든 method의 첫 번째 argument는 method를 호출하는 instance 자신이다
메서드를 호출하면 자동으로 자기 자신을 첫 번째로 주기 때문에
내가 인수를 입력하지 않았는데도 인수를 1개 받았다고 하는 것이다.
porche.start()를 보면 인수를 입력하지 않았지만 porche.start(porche)라고 생각하면 된다.

메서드를 정의할 때 매개변수를 반드시 1개(self)를 입력해줘야 한다.

메서드의 첫 번째 인수는 객체 자신이다. (self)
객체.메서드 형태로 호출할 때는 인수에 self를 반드시 생략해서 호출해야 한다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

    def start(na):  # 매개변수 아무거나 입력해줌. 보통 self를 쓴다.
        print("I started")

porche = Car()
porche.start()  # 동일하게 인수 없이 메서드 실행

👉 I started.  # 오류 안 나고 잘 나옴

매개변수 potato = porche 자기 자신이다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

    def start(potato):  # 매개변수 아무거나 입력해줌. 보통 self를 쓴다.
        print(potato)  # = print(porche)
        print("I started")

porche = Car()
porche.color = "Red Sexy Red"
porche.start()  # start 메서드 호출
-------------------------------------------
<__main__.Car object at 0x7f1a48f09400>  # print(potato)
I started  # print("I started")

매개변수 potato = porche 자기 자신이다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

    def start(potato):
        print(potato.color)  # = print(porche.color)
        print("I started")

porche = Car()
porche.color = "Red Sexy Red"
porche.start()  # start 메서드 호출

📚  dir 함수

dir은 객체가 자체적으로 가지고 있는 변수나 함수를 보여 준다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

print(dir(Car))


여기 나와 있는 건 모두 class에 있는 properties다
wheels, doors, windows, seats를 포함한 모든 걸 보여 준다.

📔  method override(재정의)

dir 함수를 이용해서 나온 것들 중 __str__ 메서드를 재정의 해보자

⭐️  __str__ method (문자열화 함수)

print(인스턴스) 인스턴스 출력했을 때 나올 형식을 지정해주는 함수
인스턴스를 출력할 때 문자열로 어떻게 표현될지 정해준다.

https://programmers.co.kr/learn/courses/2/lessons/326#

__str__ method 사용 안 하고 인스턴스를 출력하면
<__main__.Car object at 0x7f19e149f640> 라고 나온다.

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

porche = Car()
print(porche)

👉 <__main__.Car object at 0x7f19e149f640>

self에는 porche가 들어간다.
self.wheels = porche.wheels

class Car():
    wheels = 4
    doors = 4
    windows = 4
    seats = 4

    def __str__(self):
      return f"Car with {self.wheels} wheels" # 인스턴스 출력할 때 나올 형식 지정

porche = Car()
print(porche) # 인스턴스 출력

👉  Car with 4 wheels

⭐️  __init__ method (초기화 함수)

인스턴스를 생성하는 순간 자동으로 호출된다.
__init__ 메서드 매개변수에 값을 주려면 인스턴스를 생성할 때 괄호 안에 인수를 입력하면 된다.
자동으로 호출되기 때문에 __init__ 메서드를 따로 호출하지 않아도 된다.
__init__ 메서드도 다른 메서드와 마찬가지로 첫 번째 매개변수 self에 생성되는 객체가 자동으로 전달된다.

class FourCal:
    def __init__(self, first, second): # 인스턴스가 생성될 때 자동으로 호출된다.
        self.first = first
        self.second = second
    
a = FourCal(4, 2) # 인스턴스를 생성할 때 괄호 안에 인수를 입력해준다.   
print(a.first)  
print(a.second) 

👉
4
2

📔  Key로 Value얻기 (get 함수)

class Car():
    def __init__(self, **kwargs):  # kwargs는 딕셔너리 형태
        print(kwargs)  # 매개변수 출력
        self.wheels = 4
        self.doors = 4
        self.windows = 4
        self.seats = 4

    def __str__(self):
        return f"Car with {self.wheels} wheels"

porche = Car(color="green", price="$40")
print(porche)

👉 
{'color': 'green', 'price': '$40'}  # print(kwargs)
Car with 4 wheels

kwargs는 dictionary 자료형이다.
dictionary는 get 이라는 함수를 쓸 수 있다.

점프 투 파이썬
https://wikidocs.net/16#_8

딕셔너리이름.get(‘Key’)

get(x) 함수는 x라는 Key에 대응되는 Value를 돌려준다.
딕셔너리 안에 찾으려는 Key 값이 없을 경우 미리 정해 둔 디폴트 값을 대신 가져오게 하고 싶을 때에는
get(‘Key’, '디폴트값')을 사용하면 된다.

class Car():
    def __init__(self, **kwargs):
        self.wheels = 4
        self.doors = 4
        self.windows = 4
        self.seats = 4
        self.color = kwargs.get('color', 'black')
        self.price = kwargs.get('price', '$20')

    def __str__(self):
        return f"Car with {self.wheels} wheels"

porche = Car(color="green", price="$40")
print(porche.color, porche.price)

mini = Car()
print(mini.color, mini.price) # 해당하는 값이 없으므로 디폴트값이 출력된다.

👉 
green $40
black $20

📔  클래스의 상속 (inherit)

어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.
클래스를 상속하기 위해서는 다음처럼 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.
class 클래스이름(상속할클래스이름)
보통 상속은 기존 클래스를 변경하지 않고 기능을 추가하거나 기존 기능을 변경하려고 할 때 사용한다.

class Convertible(Car):

class Car():
    def __init__(self, **kwargs):
        self.wheels = 4
        self.doors = 4
        self.windows = 4
        self.seats = 4
        self.color = kwargs.get('color', 'black')
        self.price = kwargs.get('price', '$20')

    def __str__(self):
        return f"Car with {self.wheels} wheels"

class Convertible(Car):  # 괄호 안에 상속할 클래스 이름을 넣는다.
    def take_off(self):
        return "taking off"

Car class에 있는 모든 properties들을 그대로 가져올 수 있다.

원한다면 계속해서 extend 시켜서 다른 class를 가져올 수 있다.
마트료시카(러시아 인형) 같은 원리

class Somethig(Convertible):  # 확장한 클래스를 상속한다. 계속해서 확장 가능하다.
    pass # pass는 아무것도 수행하지 않는 문법으로 임시로 코드를 작성할 때 주로 사용한다.

마트료시카


__str__ 메서드 override(재정의)

class Car():
    def __init__(self, **kwargs):
        self.wheels = 4
        self.doors = 4
        self.windows = 4
        self.seats = 4
        self.color = kwargs.get('color', 'black')
        self.price = kwargs.get('price', '$20')

    def __str__(self):
        return f"Car with {self.wheels} wheels"

class Convertible(Car):
    def take_off(self):
        return "taking off"

    def __str__(self):  # 확장한 클래스에서 메서드를 재정의 할 수 있다.
        return f"Car with no roof"


porche = Convertible(color="green", price="$40")
print(porche)

👉  
Car with no roof

📚  super()

부모클래스의 메서드를 호출하는 함수
자식클래스에서 오버라이드한 메서드에서 부모클래스의 메서드를 그대로 사용하고 싶을 때 호출한다.
자식클래스의 __init__ 메서드에서 많이 쓰인다.

super().부모클래스의메서드

super.을 입력하면 부모클래스에 있는 properties 목록이 뜬다.
super

super().__init__(**kwargs)
부모클래스의 __init__ 메서드 호출하였다. 인수로 **kwargs를 입력.

class Car():
    def __init__(self, **kwargs):
        self.wheels = 4
        self.doors = 4
        self.windows = 4
        self.seats = 4
        self.color = kwargs.get('color', 'black')
        self.price = kwargs.get('price', '$20')

    def __str__(self):
        return f"Car with {self.wheels} wheels"


class Convertible(Car):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)  # 인수로 **kwargs를 써서 green과 $40을 받았다
        self.time = kwargs.get('time', 10) # 자식클래스에는 추가하고 싶은 내용만 입력하면 된다. 

    def take_off(self):
        return "taking off"

    def __str__(self):
        return f"Car with no roof"


porche = Convertible(color="green", price="$40")
print(porche.color)

👉  green

super().__init__()
부모클래스의 __init__ 메서드 호출하였다. 인수에 아무것도 입력하지 않았다.

class Car():
    def __init__(self, **kwargs):
        self.wheels = 4
        self.doors = 4
        self.windows = 4
        self.seats = 4
        self.color = kwargs.get('color', 'black')
        self.price = kwargs.get('price', '$20')

    def __str__(self):
        return f"Car with {self.wheels} wheels"


class Convertible(Car):
    def __init__(self, **kwargs):
        super().__init__()  # 인수에 **kwargs를 지워서 green이랑 $40 못 받음
        self.time = kwargs.get('time', 10)

    def take_off(self):
        return "taking off"

    def __str__(self):
        return f"Car with no roof"


porche = Convertible(color="green", price="$40") # 인수를 넣었는데도 반영이 안 됨
print(porche.color)

👉  black  # 디폴트 값으로 나옴

🧐 연습문제

class Car():
    def __init__(self, name):
        self.name = name

    def run(self):
        print("차가 달립니다.")


class Truck(Car):
    # 이 아래에서 __init__ 메소드를 오버라이드 하세요.
    def __init__(self, name, capacity):
        super().__init__(name)
        self.capacity = capacity

    def load(self):
        print("짐을 실었습니다.")


Arocs = Truck("Benz", 25.5)
print(Arocs.name)
print(Arocs.capacity)

👉
Benz
25.5

0개의 댓글