일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- docker
- lambda
- node
- react
- SSA
- 카톡
- SAA
- dict
- git
- AWS
- RDS
- 채팅
- EC2
- merge
- Class
- wetube
- NeXT
- S3
- 파이썬
- MongoDB
- Props
- crud
- 중급파이썬
- Vue
- async
- TypeScript
- 튜플
- socket io
- pandas
- flask
- Today
- Total
목록Python (87)
초보 개발자

[함수를 만들어서 반환하는 함수] 데코레이터를 이해하기 위해 네스티드 함수와 클로저를 공부해보자. 함수는 객체이고 함수의 이름은 객체를 참조하는 변수이다. 함수 안에서 정의된 함수를 nested함수라고한다. maker는 위에서 정의한 nested함수를 반환하는 함수이다. 우리가 maker라는 함수를 호출하면서 숫자 2를 전달하고 있다. 그럼 함수는 return 2 * n 를 반환하는 형태로 만들어 질 것이다. 그 다음에는 숫자 3을 전달하고 maker함수 안에서 3 * n을 반환하는 함수를 만들었다. [클로저 (Closure)] 앞서 보인 예제에서 한가지 짚고 넘어갈 내용이 있다. m은 maker 안에서만 존재하는 변수인데.. maker 밖에서도 m이 유효할까??? 변수 m은 maker함수에서 선언된 변..

[안전하게 접근하기] 객체가 갖는 값에 직접 접근하는 것은 오류의 확률을 높이므로 메소드를 통해 접근하는 것이 안전하다. 따라서 언더바 2개를 사용하여 변수를 만들고, 이를 외부에서 접근하지 못하도록 설정한 뒤 getter와 setter을 생성하여 이 걸로 값을 변경 및 조회를 하도록 하는 경우가 있다. 하지만 이 경우에는 복잡해질 수 있다. 예를들어 전에는 n.a = 5 n.a 이런식으로 값을 직접 변경 및 조회가 가능했지만 이젠 n.seta(5) n.geta() 이런식으로 변경 및 조회를 해야하니까 말이다. 따라서 아래와 같이 작성을 해보자 프로퍼티를 함수를 호출하면서 프로퍼티 객체를 생성한다. 그리고 그 객체를 n에 넣어준 것이다. 그리고 인자에 2개의 메서드를 넣어주었다. 첫번째에는 getter ..

[__dict__의 단점과 그 해결책] 파이썬은 __dict__의 이름으로 객체 하나당 하나의 딕셔너리를 할당한다. 그런데 딕셔너리는 리스트나 튜플에 비해 메모리 사용량이 많다. 따라서 많은 수의 객체를 생성해야 하는 경우에 부담이 될 수 있다. 다음과 같이 __slots__를 추가해주면 dict가 생성이 되지 않고 변수는 n과 a밖에 설정할 수 없다는 뜻이다. 따라서 self.m 이렇게 정의가 불가능하고 self.n, self,a 와 같이 설정해야한다. 그리고 전 처럼 p.b = 10 이렇게 접근 및 생성이 불가능하다. 전에는 __dict__라는 딕셔너리가 생성이 되어 여기서 변수를 관리하고 그걸 참조하는 역할을 하였지만 지금은 아니기 때문에 변수 n,a 두개만 가지고 있는 객체라고 할 수 있다. 즉 ..

위와 같은 클래스를 만들었다고 해보자. add_age는 나이를 추가해주는 함수이다. 나이는 기본적으로 음수가 될 수 없으니 사전에 음수를 차단하는 기능을 만들어주었다. 그리고 p라는 객체를 만들고 나이를 하나 추가해주었다. 하지만 age에 직접접근하여 -20을 해주었더니 결국 음수를 더해버렸다. 이렇게 p.age처럼 직접 변수에 접근하는 것을 직접접근이라고한다. 우리는 보안을 높이기 위해 간접접근 하는 방법을 배워보려고한다. 그 방법은 변수 이름 앞에 언더바 2개를 붙이는 것이다 __ 이렇게 붙이면 외부에서 접근을 못하도록 파이썬이 막아준다. 클래스 내에서는 당연히 __변수로 접근이 가능하다. 위 처럼 __를 붙여주고 다시 실행시켜보면 아래와 같은 오류가 난다. Person에는 age라는 변수가 없다고 ..

[연산자 오버로딩 간단히 이해하기] 연산자 오버로드란 +, - 와 같은 연산자에 다른 기능을 입히는 것을 말한다. 이 Account는 계좌 클래스이고 이 클래스의 메서드로 스페셜 메소드를 주었다. __add__란 acnt + 100 이라는 구문은 '객체' + '인자' 로 인식을하여 acnt에 __add__라는 것이 있으면 +를 __add__함수로 인식하고 그 오른 쪽에 있는 것을 인자로 인식을 한다. acnt - 100도 마찬가지이다. acnt 옆에 -가있다면 먼저 acnt가 메서드에 __sub__라는 것이 있나 확인하고 있다면 그 함수를 실행시키는데 그 인자는 오른쪽에 있는 것을 넣는다. 함수호출과 같이 객체에 ()를 붙여서 호출하는 경우 acnt() < 이 객체가 __call__이라는 메서드를 있는지..

room admin을 좀 바꿔보려고한다. list_display를 사용하여 간단히 정보를 볼 수 있도록 하였고, list_filter를 사용하여 조건에 맞는 정보만 볼 수 있도록 하였다. search_fields를 사용하여 조건에 맞는 걸 검색 할 수 있는데 =city는 만약 city가 seoul이라면 seoul혹은 Seoul,SEOUL이런식으로 대소문자 구분 없이 일치해야 한다. ^city라면 startswith옵션으로 seo Seo SEO이런식으로 적으면 seoul에 해당하는 방들이 나온다. 여기서 host는 room의 field명인데 foreign key로 구성되어있다. 언더바 2개 __를 사용하면 그 fk에서 정보를 가져올 수 있다. 따라서 user_name이 taehyeki라면 tae Tae T..

Review 리뷰를 작성하는 모델이다. 먼저 앱을 등록해주고 필드를 적어주었다. 리뷰를 적는 review와 평점을 적는 것들 그리고 user와 room을 foreign key로 받아왔다. Room(1)과 Review(N)가 ForeignKey 로 연결되어 있는 상태이다. N의 입장에서 ForeignKey를 설정 해 주었다. 만약 N의 입장에서 Room의 정보에 접근하고 싶다면 어떻게 해야할 까? self.room.country 이런 식으로 접근 가능하다. self.room만 적어주면 Room의 __str__ 함수가 실행이 되어 room.name이 자동으로 출력이 되는 것이다. 이를 makemigrations와 migrate를 하고 admin에 등록해주자 그리고 모델안에서 함수를 생성할 수 있다. 평점의 ..

먼저 room app을 config.settings에 추가해주자. 우리는 room이 모델이 만들어진 시간, 업데이트 시간 등이 필요하다. 따라서 아래와 같이 만들어 줄 수 있다. 근데 저 필드가 단순히 Room에서만 사용될 것이 아니라, review, reservation 등 여러 곳에서 사용될 필드인데 그 때마다 계속 created, updated를 만들어준다면 불필요한 반복이 될 것이다. 따라서 이걸 클래스로 만들어주어 재사용성을 높이려고 한다. django-admin startapp core core라는 앱을 만들고 config.settings에 추가해주자. 그리고 아래와 같은 클래스를 만들어주자. 이 클래스를 다른클래스가 상속 받는다면 기본적으로 저 created가 들어있으니 따로 만들어 줄 필요..