TIL day13 wecode

yo·2020년 6월 6일
0

2315 out

니코 장고 맛보기강의

장고에서 중요한 두 가지 컨셉

  1. arguments, keyword arguments.
  2. 객체지향 프로그래밍(class, inheritance, method 등)

aruguments, keyword arguments.

*args: positional arguments를 무한히 받을 수 있음.
**kwargs: keyword arguments를 무한히 받을 수 있음

def plus(a, b):
    return a, b

문제가 전혀 없는 간단한 함수다.
그런데 만약, 인자로 더 많은 값을 받고 싶다면??
*args를 써주면 해결된다. 무한히 값을 받을 수 있다.

def plus(*args):
    return args

여기다 키워드 형태 인자까지 받고 싶다면? (ex: hello=True, fdf=True이런거. 여기서 키워드는 =앞에 있는 것들임)

def plus(*args, **kwargs):
    print(args)
    print(kwargs)

예시

def plus(*args, **kwargs):
    print(args)
    print(kwargs)


plus(1,3,5,1,3,5,q=True, d=True, z="a")

결과
(1, 3, 5, 1, 3, 5)
{'q': True, 'd': True, 'z': 'a'}

-중요: args는 tuple로 출력, `kwargs**`는 딕셔너리 형태로 출력된다.

object oriented programming

-장고에서 많이 보게 될 형태
-코드를 정리하는 방법 중 하나.
-많은 언어들이 객체지향 형태다.
-class는 설계도(blueprint)와 같다.

-위 설계도 하나로 수 많은 아이언맨들을 만들어 낼 수 있는 것과 같다.
-설계도 안엔 모든 상세사항이 들어가있다.
-이 설계도로 아이언맨을 만든다면 그건 instance라 불리게 된다.
-instance는 설계로도 만든 살아있는 결과물이다. 설계도로 만든 제품.

예시

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

porche = Car()
porche.color = "red"
print(porche.seats)
print(porche.color)

print(type(porche))

Car라는 클래스를 만들었다.
포르쉐를 차의 인스턴스로 만들었다.
포르쉐를 빨간색으로 만들었다.
포스뤠의 seats, color, type을 호출했다.
4 red <class '__main__.Car'>

methods

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

def start():
    print("I STARTED")

위에 start()는 함수이다. 반면, 아래의 start()는 method다.
즉, method는 클래스 안에 있는 function이다.

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

    def start():
        print("I STARTED")

-기본적으로 모든 메서드엔 첫번째의 argument 주어진다. self. 사실 self대신 potato를 써도된다.
-메서드의 첫 argument는 그 메서드를 호출하는 instance다.
-파이썬은 메서드를 호출할 때 그 메서드의 instace를 첫번쨰 argument로 사용한다.

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

    def start():
        print("I STARTED")


porche = Car()
porche.start()

결과
    porche.start()
TypeError: start() takes 0 positional arguments but 1 was given

맨 아랫줄에서 start메서드를 호출했는데 에러가 난다.
메서드를 정의할 땐 항상 하나 이상의 인자를 줘야한다.

    def start(self):
        print("I STARTED")

보통 self를 쓴다.

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

    def start(potato):
        print(potato.color)
        print("I STARTED")


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

결과
Red
I STARTED

클래스를 만들면 자동생성되는 method들

클래스를 호출하면 클래스라고 뜬다.

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

print(Car)

결과
<class '__main__.Car'>

dir(Car)을 호출하면 아래와 같다.

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'doors', 'seats', 'wheels', 'windows']

__str__은 메서드인데, class의 instance가 호출될 떄마다 실행된다.
아래에선, instance인 porche가 호출됐으니 str이 작동했고, <main.Car object at 0x105084760>를 불러왔다.

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

porche = Car()
print(porche)

결과
<__main__.Car object at 0x105084760>

확인차 __str__를 재정의해보자.

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

    def __str__(self):
        return ("lalalala")

porche = Car()
print(porche)

직접 str메서드를 호출하지 않았지만, instance인 porch를 호출하는 것만으로도 str이 출력됨을 볼 수 있다.

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




porche = Car(color="red", price="$48")
mini = Car()

print(porche.color, porche.price, porche.wheels)
print(mini.color, mini.price, mini.wheels)

결과
red $48 4
black $20 4

만약, 차긴 찬데 창문이 열리는 convertable기능이 있는데 차를 만들고 싶으면 어떻게 할까?
Car에다가 메서드를 추가하기엔 문제가 있다. 대부분의 차는 convertable기능이 없기 때문이다. 그렇다고 새로운 클래스(차와 완전 같으면서 단지 convertable 메서드만 추가한)를 통채로 만들기엔 비효율적이다.
이럴 때 쓰는게 상속이다. 매우 편리하다.

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


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


BWM = Convertible()
porche = Car(color="red", price="$48")

print(BWM.take_off()), print(BWM.wheels)
print(porche.color, porche.price, porche.wheels)

새로생긴 Convertible 클래스의 속성에다 time이라는 지붕 열리는 시간을 추가하고 싶으면 어떻게 할까?

class Convertible(Car):
    def __init__(self, **kwargs):
        self.time = 
    def take_off(self):
        return "taking off"

이렇게 해버리면 부모의 init속성은 모두 날라가게 된다.
우리가 원하는게 아니다. 어떻게 할까?
이럴 떄를 위해 생긴게 super()이다. 부모클래스를 호출하는 함수다.

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


class Convertible(Car):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.time = kwargs.get("time", 5)

    def take_off(self):
        return "taking off"

hyundai = Convertible(color = "red")

print(hyundai.doors)
print(hyundai.color)
print(hyundai.time)

만약 super().__init__(**kwargs) 에서 괄호 안의 **kwargs를 지우면 어떻게 될까?
hyundai = Convertible(color = "red") 이렇게 컬러를 red로 줘도 안먹는다.
그리고 dafault값은 black으로 출력된다.

-pip install Django
-pip install Django --upgrade
-django-admin startproject 프로젝트이름 (프로젝트 생성하고 싶은 위치로 먼저 이동해서, 위 명령어 치면 디렉토리 생성됨)

프로젝트와 어플리케이션

쇼핑몰을 만드는게 프로젝트.
게시판, 결제, 장바구니, 회원관리 같은 하나하나의 기능을 application이라 한다.
python manage.py startapp 어플이름 어플리케이션 시작하는 방법.

MVT 패턴


장고는 MVT패턴
1클라이언트에서 요청 들어옴
2뷰가 컨트롤 센터(지휘자). DB접근이 필요한 요청이면 Model에게 위임함.
3모델 뒤에 db있음. 데이터 꺼내서 뷰에게 넘겨줌
4뷰가 가공작업 할 거 있음 하고, 템플릿에게 넘겨줌.
5템플릿에서 클라이언트에 응답할 가장 적합한 템플릿 하나 뽑아서 뷰에게 줌.
6뷰가 클라이언트에게 응답.

모든 개발은 이런 순서로 됨.

프로젝트 디렉토리 구조

애플리케이션 만들고 들어가보면 아래처럼 들어있음.
템플릿만 없는데, 템플릿은 따로 해야됨.
모델은 아주 경량의 데이터베이스를 가지고 있음.

장고 프레임워크 흐름도

-장고는 기본적으로 관리자모드 제공

데이터베이스(ORM)

<목치>
테이블 생성
레코드 다루기(create, read, update, delete)

테이블 생성

profile
Never stop asking why

0개의 댓글