노마드 코더 Python으로 웹 스크래퍼 만들기
https://nomadcoders.co/python-for-beginners
점프 투 파이썬
https://wikidocs.net/28
객체(인스턴스) 만드는 방법
객체 = 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 # 잘 나온다.
🔹 function과 method의 차이
function은 클래스 밖에 단독으로 있다.
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은 객체가 자체적으로 가지고 있는 변수나 함수를 보여 준다.
class Car():
wheels = 4
doors = 4
windows = 4
seats = 4
print(dir(Car))
여기 나와 있는 건 모두 class에 있는 properties다
wheels, doors, windows, seats를 포함한 모든 걸 보여 준다.
dir 함수를 이용해서 나온 것들 중 __str__
메서드를 재정의 해보자
__str__
method (문자열화 함수)print(인스턴스)
인스턴스 출력했을 때 나올 형식을 지정해주는 함수
인스턴스를 출력할 때 문자열로 어떻게 표현될지 정해준다.
__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
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
어떤 클래스를 만들 때 다른 클래스의 기능을 물려받을 수 있게 만드는 것이다.
클래스를 상속하기 위해서는 다음처럼 클래스 이름 뒤 괄호 안에 상속할 클래스 이름을 넣어주면 된다.
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
부모클래스의 메서드를 호출하는 함수
자식클래스에서 오버라이드한 메서드에서 부모클래스의 메서드를 그대로 사용하고 싶을 때 호출한다.
자식클래스의 __init__
메서드에서 많이 쓰인다.
super().부모클래스의메서드
super.
을 입력하면 부모클래스에 있는 properties 목록이 뜬다.
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