[Python] 4강

2022. 1. 30. 19:11Naver BoostCamp AI Tech 3기

객체지향 프로그래밍(Object-Oriented Programming, OOP) : 객체(속성, 행동)의 개념을 프로그램으로 표현함. 여기서 속성(Attribute)은 변수(Variable), 행동(Action)은 함수(Method)로 표현함. OOP는 설계도에 해당하는 Class와 실제 구현체에 해당하는 Instance로 나눌 수 있다.

여기서, 네이밍에 대한 컨벤션이 있다. 주로 파이썬 함수 및 변수 명에는 snake_case를 사용하고, 파이썬 Class 명에는 CamelCase를 사용한다.

파이썬에서는 __가 붙은 함수는 특별한 함수(Magic Method)이다. 이에 대해 알아보자.

매직 메소드는 미리 정의된 메소드로, 이 메소드들을 재정의하면서 동작이 마법처럼 일어난다 하여 매직 메소드라 하였고, _가 2개 붙으므로, 더블 언더 메소드, 일명 던더 메소드(Dunder Method)라고도 한다. 너무 많은 종류가 있어서, 일부만 정리해 보았다. 다음과 같다.

- __new__(cls[, ...]) : 새 인스턴스 생성 시 가장 처음으로 실행되는 메소드이다. 리턴 시 새로운 Object를 반환해야 한다. 주로 초기값 조작 혹은 싱글톤 패턴(인스턴스를 1개만 생성하고, 그 인스턴스만 다같이 공유하여 사용함)을 만들 때 사용한다.

- __init__(self[, ...]) : __new__ 실행으로 인스턴스가 생성되면 다음으로 실행되는 메소드로, 주로 인자를 받고 내부 인스턴스 변수로 지정해주는 역할을 한다.

- __del__(self) : 객체 소멸 시 해야할 일을 지정해주는 메소드이다. 이 메소드는 이 클래스의 레퍼런스 카운터가 0이 되어야(즉, 이 클래스를 참조하는 객체들이 전부 사라지면) 실행되는 메소드이다. 주로 객체 소멸 시 파일을 닫아준다거나 하는 경우에 이용한다.

- __repr__(self) : 객체를 표현하는 공식적인 문자열이며, repr()로 호출 가능하다. 가능한 객체에 대한 명확한 내용을 담아야 하며, 리턴값은 string이다.

- __str__(self) : __repr__와 비슷한데, 그보다는 비공식적인 문자열이며, 좀더 사용자가 보기 쉽게 문자열을 출력해준다. 만약 __str__이 없으면 __repr__이 호출된다.

- __getattr__(self, name) : 해당 객체에서 존재하지 않는 속성을 호출하려고 할 때 실행되는 메소드이다.

- __getattribute__(self, name) : 객체의 속성을 호출 시 무조건 실행되는 메소드이다. 만약에, 이 메소드를 재정의하였다면, __getattr__은 호출되지 못한다. 그러므로 __getattr__을 명시적으로 호출해야 하거나, AttributeError를 발생시켜야만 한다.

- __setattr__(self, name, value) : 객체의 속성 변경 시 호출되는 메소드이다. 주의점은 이 메소드 안에서 객체의 속성을 변경하게 되면 무한 루프(계속해서 __setattr__를 호출하게 됨)에 빠지게 되므로, 절대로 변경하면 안된다는 것이다.

- __dir__(self) : dir()호출 시 실행되는 메소드이다. dir()은 객체의 모든 속성을 보여주는 메소드이다.

- __len__(self) : 객체의 길이를 반환한다. 길이는 0 이상인 정수여야 하며, len()을 통해 호출된다.

- __getitem__(self, key)(중요함) : 객체에서 []연산자를 사용하여 조회 시 동작을 정의한다. 예시로, alist[10]은 alist.__getitem__(10)으로 동작한다. 키의 타입이 적절하지 않다면 KeyError를, 키가 인덱스를 벗어난다면 IndexError를 던져야 한다.

- __iter__(self) : 컨테이너의 iterator를 반환한다.

더 자세한 내용은 [출처] : https://corikachu.github.io/articles/python/python-magic-method

 

파이썬 더블 언더스코어: Magic Method | Corikachu

파이썬에서 __를 달고있는 메소드들에 대해서 살펴봅시다.

corikachu.github.io

class의 함수에는 첫번째 인자로 self를 매개변수로 받아야한다.

 

OOP의 특징

- 상속(Inheritance) : 부모클래스로부터 속성 및 메소드를 물려받아서 자식클래스가 사용하는 것

- 다형성(Polymorphism) : 같은 이름 메서드의 내부 로직을 다르게 작성함. 자식클래스 별로 클래스에 맞게 메서드를 다양하게 하는 것임.

- 가시성(Visibility) : 객체의 정보를 볼 수 있는 레벨을 조정하는 것. Encapsulation이라고도 하는데, 클래스 간 간섭 및 정보공유를 최소화하는 정보 은닉이다. 클래스에서 __변수 형태를 사용하면 외부에서 접근이 불가한 private 변수가 된다. (정확히는 맨글링이 일어나는 것이다.)

 

First-class objects(일급 객체) : 일등 함수 또는 일급 객체라고 하는데, parameter로 전달이 가능하거나 리턴받을 수 있다. 파이썬은 일급 함수를 지원해준다.

Inner function(내재 함수) : 함수 내에서 또 다른 함수를 정의해서 사용하는 것이다.

Closure : Inner function을 리턴해줌.

 

decorator : 복잡한 Closure를 간단하게 사용할 수 있게 해줌. 좀 더 자세히 조사해보았다.

decorator는 대상 함수를 wrapping 시켜주고, 이 wrapping 된 함수의 앞 뒤에 추가적으로 꾸며질 구문들을 정의해서 손쉽게 재사용하게 해준다. decorator는 다음과 같은 과정을 거쳐 사용한다.

- decorator 역할을 하는 함수를 정의, 이 함수의 인자에 decorator를 적용받을 함수를 받는다.

- decorator 역할을 하는 함수 내에 inner function을 선언하여 인자로 받은 함수와 추가적인 작업을 이 inner function 내에 적용시킨다.

- 이 정의된 inner function을 리턴시켜주면 된다.

만약, 클래스로 정의하려면 __call__에 정의하여 사용하면 된다. 다음은 예시다. decorator는 예시와 같이 주로 로그를 남기는데 사용하거나, 웹페이지라면 사용자를 로그인 페이지로 리다이렉트(redirect)할 때 주로 사용된다고 한다. 그리고 보통은 클래스 형태보다는 함수 형태의 decorator를 더 많이 사용한다고 한다.

class에서 *args와 **kwargs를 받는 이유는 decorator를 받는 함수에 인자가 있는 경우, 저런 식으로 가변인자로 받지 않으면 에러가 발생한다.

자세한 내용은 [출처] https://bluese05.tistory.com/30

 

python decorator (데코레이터) 어렵지 않아요

Python decorator (데코레이터)  Python 으로 작성된 Opensource 의 코드들을 보다 보면, 아래와 같이 @ 로 시작하는 구문 들을 볼 수 있다. @decorator_ def function(): print "what is decorator?"  decorat..

bluese05.tistory.com

ㄴㄴㄴ

'Naver BoostCamp AI Tech 3기' 카테고리의 다른 글

[Python] 5강  (0) 2022.02.06
Sequence to Sequence Learning with Neural Networks  (1) 2022.02.03
[Python] 3강  (1) 2022.01.28
[Python] 2강  (0) 2022.01.27
[Python] 1강  (0) 2022.01.27