본문 바로가기
Python/Study

[class 기능 정리] 코딩을 깔끔하게 해주는 기능

by beeny-ds 2022. 8. 12.

Class 기능 정리

정적메소드 (@classmethod & @staticmethod)

@classmethod
- 첫번째 인자로 클래스를 입력 ex)

https://wikidocs.net/16074

인스턴스 메소드는 인스턴스를 통해서 호출이 되고, 첫 번째 인자로 인스턴스 자신을 자동으로 전달합니다. 관습적으로 이 인수를 ‘self’라고 칭합니다. 클래스 메소드는 클래스를 통해서 호출이 되고 “@classmethod”라는 데코레이터로 정의합니다. 첫 번째 인자로는 클래스 자신이 자동으로 전달되고 이 인수를 관습적으로 ‘cls’라고 칭합니다. 스태틱 메소드는 앞서 설명한 두 메소드와는 틀리게 인스턴스나 클래스를 첫 번째 인자로 받지 않습니다. 스태틱 메소드는 클래스 안에서 정의되어 클래스 네임스페이스 안에는 있을뿐 일반 함수와 전혀 다를게 없습니다. 하지만 클래스와 연관성이 있는 함수를 클래스 안에 정의하여 클래스나 인스턴스를 통해서 호출하여 조금 편하게 쓸 수가 있는 것 입니다.

staticmethod에서는 부모클래스의 클래스속성 값을 가져오지만, classmethod에서는 cls인자를 활용하여 cls의 클래스속성을 가져오는 것을 알 수 있습니다.

 

특별한 메서드들

- https://wikidocs.net/89

메서드라는 것은 우리가 클래스를 만들면서 그 안에 만들어 넣은 함수를 말하지요? 만들어진 메서드를 사용하려면 객체.메서드()와 같은 형식으로 호출을 해주었구요.

__init__ 메서드 (초기화)

__init__이라는 메서드도 있지요? 이것이 바로 파이썬에서 특별하게 약속된 메서드 가운데 하나로, 초기화(initialize) 메서드라고도 합니다. 어떤 클래스의 객체가 만들어질 때 자동으로 호출되어서 그 객체가 갖게 될 여러 가지 성질을 정해주는 일을 하지요.

__call__메서드

더블 언더스코어(__)로 시작하는 매직메소드를 통해 클래스가 특별한 동작을 수행할 수 있도록 만들 수 있다. 함수를 호출하는 것처럼 클래스의 객체도 호출할 수 있게 만들수 있는데 이때 필요한 매직메소드가 __call__이다.

 

7.5. 특별한 메서드들

이제 메서드에 대해서는 다들 알고 계시겠죠? 메서드라는 것은 우리가 클래스를 만들면서 그 안에 만들어 넣은 함수를 말하지요? 만들어진 메서드를 사용하려면 `객체.메서드()` ...

wikidocs.net

 

 

__getitem__

두개의 밑줄로 시작하는 파이썬의 특별 메소드 중 하나이다. 슬라이싱을 구현할 수 있도록 도우며 리스트에서 슬라이싱을 하게되면 내부적으로 __getitem__ 메소드를 실행한다는 점이 중요하다. 따라서 객체에서도 슬라이싱을 하기 위해서는 __getitem__ 메소드가 필수적이다.

인스턴스 변수에 직접 접근하지 말고 객체 자체를 통해서 슬라이싱을 구현하기 위해서는 **getitem 특별 메소드를 정의해야한다.** 그리고 이 함수는 인덱스를 인수로 받아야 한다.

 

__del__ 메서드 (소멸자)

__init__ 메서드와 반대로 객체가 없어질 때 호출되는 메서드도 있습니다. 이런 것을 소멸자(destructor)라고 하는데, 파이썬에서는 __del__ 메서드가 소멸자의 역할을 맡고 있죠.

 

__repr__ 메서드 (프린팅)

별 다른 것은 없구요, return 문을 사용했다는 것만 눈여겨보시면 됩니다. __repr__ 메서드는 '문자열'을 'return' 한다고 생각하시면 되겠죠?

 

__add__ 메서드 (덧셈)

도형 a와 b를 덧셈 연산자(+)로 더했더니 두 도형의 넓이가 더해졌죠? 마치 보통의 두 숫자를 더하는 것처럼 간단하게 말입니다. 이와 같이 특별한 메서드를 사용해서 연산자가 하는 일을 정의하는 것을 연산자 중복(overload)이라고 부른답니다. 연산자 중복을 이용하면 사용자가 직접 만든 클래스의 객체에 대해서도 연산자를 쓸 수 있게 되지요. 마치 파이썬 자체에서 제공하는 자료형처럼 말입니다.

 

__cmp__ 메서드 (비교)

두 개의 객체를 비교하는 비교 연산자(<, >, ==)를 쓸 수 있도록 해주는 메서드를 살펴보면서 정리를 하도록 하겠습니다.


 

파이썬 언더스코어(_)에 대하여

https://mingrammer.com/underscore-in-python/   https://doorbw.tistory.com/153

1. 인터프리터에서 사용되는 경우
2. 값을 무시하고 싶은 경우
3. 숫자 자리수 구분을 하는 경우
4. private으로 선언하고 싶은 경우
5. 중복된 이름을 피하고 싶은경우

__double_leading_underscores: 이는 컨벤션이라기보단 하나의 문법적인 요소이다. 더블 언더스코어는 클래스 속성명을 맹글링하여 클래스간 속성명의 충돌을 방지하기 위한 용도로 사용된다. (맹글링이란, 컴파일러나 인터프리터가 변수/함수명을 그대로 사용하지 않고 일정한 규칙에 의해 변형시키는 것을 말한다.) 파이썬의 맹글링 규칙은 더블 언더스코어로 지정된 속성명 앞에 _ClassName을 결합하는 방식이다. 즉, ClassName이라는 클래스에서 __method라는 메서드를 선언했다면 이는 _ClassName__method로 맹글링 된다.

더블 언더스코어로 지정된 속성명은 위와 같이 맹글링이 되기 때문에 일반적인 속성 접근인 ClassName.__method으로 접근이 불가능하다. 간혹, 이러한 특징으로 더블 언더스코어를 사용해 진짜 private처럼 보이게 하는 경우가 있는데 이는 private을 위한 것이 아니며 private으로의 사용도 권장되지 않는다.

맹글링 : 소스코드에 선언된 함수 또는 변수의 이름을 컴파일 단계에서 컴파일러가 일정한 규칙을 가지고 변형하는 것

맹글링이 필요한 이유 : 객체 지향에서 오버로딩(Overloading)시 파라미터 형태에 따라 알아서 구별하여 호출 다른 Namespace 내에 있는 같은 이름의 함수와 변수에 대해 에러 없이 구별하여 호출할 수 있는 것은 맹글링을 통해 고유한 이름들을 만들기 때문에 가능. 즉, 객체 지향적 프로그래밍을 위해 즉, 컴파일러가 오버로딩과 네임스페이스별 함수 및 변수를 구별할 수 있도록 함으로써 에러 없이 정상적으로 동작하는 프로그램을 만들기 위해 필요하다.


 

콜백 함수(Callback)의 정확한 의미는 무엇일까?

출처: https://satisfactoryplace.tistory.com/18 [만족]

콜백 함수란

1. 다른 함수의 인자로써 이용되는 함수.
2. 어떤 이벤트에 의해 호출되어지는 함수.

 

변수가 있는지 확인하기 ( hasattr / getattr / setattr )

https://wikidocs.net/13945

 

(*args **kwargs)

https://brunch.co.kr/@princox/180

함수의 파라미터 순서 : 일반 변수, *변수, **변수
*변수 > 여러 개가 아규먼트로 들어올 때, 함수 내부에서는 해당 변수를 '튜플'로 처리
**변수 > 키워드 = ''로 입력할 경우 그것을 각각 키와 값으로 가져오는 '딕셔너리'로 처리


 

추상 클래스 사용하기

https://dojang.io/mod/page/view.php?id=2389
 

실행을 해보면 에러가 발생합니다. 왜냐하면 추상 클래스 StudentBase에서는 추상 메서드로 study go_to_school을 정의했습니다. 하지만 StudentBase를 상속받은 Student에서는 study 메서드만 구현하고, go_to_school 메서드는 구현하지 않았으므로 에러가 발생합니다.

따라서 추상 클래스를 상속받았다면 @abstractmethod가 붙은 추상 메서드를 모두 구현해야 합니다. 다음과 같이 Student에서 go_to_school 메서드도 구현해줍니다.

모든 추상 메서드를 구현하니 실행이 잘 됩니다.

StudentBase는 학생이 반드시 해야 하는 일들을 추상 메서드로 만들었습니다. 그리고 Student에는 추상 클래스 StudentBase의 모든 추상 메서드를 구현하여 학생 클래스를 작성했습니다. 이처럼 추상 클래스는 파생 클래스가 반드시 구현해야 하는 메서드를 정해줄 수 있습니다.

참고로 추상 클래스의 추상 메서드를 모두 구현했는지 확인하는 시점은 파생 클래스가 인스턴스를 만들 때입니다. 따라서 james = Student()에서 확인합니다(구현하지 않았다면 TypeError 발생).

반응형

댓글