일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- git
- S3
- pandas
- SAA
- crud
- react
- SSA
- 중급파이썬
- Props
- EC2
- AWS
- dict
- MongoDB
- flask
- 파이썬
- wetube
- lambda
- socket io
- Class
- TypeScript
- 카톡
- 튜플
- docker
- node
- Vue
- merge
- RDS
- async
- NeXT
- 채팅
- Today
- Total
목록Python/윤성우 열혈 파이썬 (30)
초보 개발자
[함수를 만들어서 반환하는 함수] 데코레이터를 이해하기 위해 네스티드 함수와 클로저를 공부해보자. 함수는 객체이고 함수의 이름은 객체를 참조하는 변수이다. 함수 안에서 정의된 함수를 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__이라는 메서드를 있는지..
[스페셜 메소드] 다음과 같은 형태의 이름을 가지면서 파이썬에 의해 호출되는(프로그래머가 그 이름을 직접 명시하여 호출하지 않는) 메소드를 가리켜 '스페셜 메소드'라 한다. __name__ 가장 대표적인 스페셜 메소드로 __init__이 있다. 이는 객체 생성시 자동으로 호출되는 메소드이다. 그리고 다음은 우리가 호출해본 경험이 있는 스페셜 메소드들이다. __len__ : len 함수가 호출되었을 때 호출 됨 __iter__ : iter 함수가 호출되었을 때 호출 됨 __str__ : str 함수가 호출되었을 때 호출 됨 우리가 iter(s)를 호출하면 실제로 파이썬은 s.__iter__() 이렇게 호출을 한다. 약속이다. len(s) -> s.__len__() str(s) -> s.__str__() 위..
[부모 클래스와 자식 클래스] class A와 class Z가 있고 Z가 A를 상속한다면(받음) A가 가지고 있는 메서드들을 가지고 오고, 또 새로운 메서드를 추가할 수도이 있다. A클래스 : 부모 클래스, 슈퍼 클래스, 상위클래스 Z클래스 : 자식 클래스, 서브 클래스, 하위 클래스 # father_son.py class Father: def run(self): print('so fast!') class Mother: def dive(self): print('so deep!') class Son(Father, Mother): def jump(self): print('so high!!') def main(): s = Son() s.run() s.jump() s.dive() main() father와 mo..
[객체 안에 변수가 만들어 지는 시점] 클래스 : 객체를 만들기 위한 일종의 설계도 객체 : 클래스를 기반으로 만들어진 실제 사물 위의 정의가 일반적인 클래스와 객체의 정의이다. 그런데 파이썬의 클래스와 객체는 조금 독특한 부분이 있다. 파이썬의만의 유연함이 있다. class Simple: def seti(self, i): self.i = i def geti(self): return self.i 클래스의 기본 정의는 다음과 같다. 클래스 내에 들어갈 변수와(데이터와) 메소드를(기능을) 결정하는 것 그런데 위의 클래스에는 메소드의 정의만 존재한다. 즉 변수의 선언은 존재하지 않는다. 그러나 파이썬은 객체에 필요한 변수를 알아서 생성해준다. 그리고 객체내에 변수가 생성되는 시점은 다음과 같다. s1 = Si..