개발자로 후회없는 삶 살기

파이썬 심화 PART.변수 명명규칙부터 클래스 정의법까지 본문

[AI]/[Python]

파이썬 심화 PART.변수 명명규칙부터 클래스 정의법까지

몽이장쥰 2023. 11. 1. 14:19

서론

변수 명명 규칙부터 클래스 정의법까지 이전에는 몰랐던 부분을 심화로 알아봅니다.

 

본론

- 파이썬 변수 명명 규칙

0) 속성은 소문자로 시작합니다. 메서드도 시작은 소문자로 시작합니다. 그래서 heapq.heappop()이 heapq 모듈 내부의 메서드를 첫 글자를 소문자로 시작한 것입니다.

 

1) 자바는 클래스 내부 메서드나 속성을 카멜식으로 쓰는 데 파이썬은 단어 사이를_로 구분하고 모두 소문자로 시작합니다.

 

그래서 내장 모듈 string의 ascii_lowercase가 내부 속성을 표현법으로 표현한 것입니다.

 

2) __로 시작하는 변수 : 클래스나 객체 내의 보호 속성을 정의할 때 첫 글자를 __로 시작합니다.

3) __양옆__ : 파이썬 내부에서만 사용되는 스페셜 속성이나 메서드

 

4) 상수 : 변수 이름이 전부 대문자인 경우 상수라고 암묵적으로 정의합니다.

 

※ 보호 속성 : 외부 클래스와 객체에서 속성에 직접 접근해서 사용하지 않도록 주의하라는 의미(private), 비공개 속성입니다.

 

클래스 변수로 정의되어 있지만 외부에서 접근할 수 없습니다.

 

- 모든 값은 객체이다.

파이썬에서는 변수에 할당되는 모든 값은 객체이고, 객체를 간단하게 숫자와 문자열 등으로 리터럴로 작성할 수도 있고 연산의 표현식으로도 만들 수 있습니다. a = 100에서 100은 리터럴 객체이고 a도 객체입니다.

 

- 리터럴 표기법

수식이나 글자로 텍스트를 작성하는 방식, '1', '문자열' 그대로 쓰는 것을 리터럴 표기법이라고 합니다. 리터럴로 표기하면 파이썬이 알아서 자료형을 배정합니다.

 

-> 표현식

a+200해서 300이 나오는데 화면에 표기할 때와 내부에서 실행할 때 조금 다르게 처리됩니다. 표현식에서는 +로 화면에 나타내지만 실제 연산자를 실행할 때는 각 클래스(파이썬의 모든 변수에 할당되는 값은 객체이다.)의 내부에 정의된 스패셜 메소드로 변환해서 실행합니다.

 

ex, 덧셈 연산자는 스페셜 메서드 add입니다. 스페셜 메서드는 __ 양옆에 붙은 메서드로 표시합니다. 파이썬의 모든 변수는 객체입니다. 그래서 변수.__add__가 됩니다.

 

- 실수

파이썬의 실수는 float로 double이 없습니다.

- 연산자와 스페셜 메서드

__add__같은 스페셜 메서드가 클래스에 어떻게 정의되고 언제 이를 호출하는지에 대해서 한번 알아보겠습니다.

 

정수 클래스인 int의 add 스패셜 메서드를 조회하면 slop wrapper라고 나옵니다. 이는 c언어로 작성된 스페셜 메서드라는 뜻입니다. 자바의 네이티브 메서드와 같은 개념입니다.

즉, 정리해보면 클래스 내부에는 스페셜 메서드라는게 있는데 이는 c언어로 작성되었고 파이썬에서 특별하게 선언되는 메서드입니다. dir로 보면 이렇게 많은 스페셜 메서드가 정의되어 있습니다. *는 __mul__이고 -는 __sub__입니다.

 

- 동적 자료형

파이썬은 변수에 할당되는 모든 것이 객체이고 객체를 할당할 때 자동으로 자료형이 선정됩니다.(바인딩)

 

type()으로 변수에 바인딩된 자료형을 확인할 수 있고 객체 내부의 __class__를 조회하면 모든 객체는 자신을 생성한 클래스에 대한 정보를 항상 가지고 있습니다.

 

- 함수와 메서드가 어떤 객체인가

클래스 자체의 메서드를 호출할 때와 객체를 생성하고 호출할 때 차이가 있습니다. 보면 클래스 단위와 객체 단위의 차이처럼 보입니다. 클래스에 정의된 함수는 객체이고 객체의 함수는 메서드입니다. 이는 추후에 더욱 자세히 알아봅니다.

 

- 객체 원소에 대한 변경 여부(Mutation)

내장 클래스에 대해 immutable과 mutable을 확인해봅니다. 변경할 수 없는 자료형에는 string이 있습니다. 문자열 클래스는 변경할 수 없습니다. 파이썬의 모든 변수 할당은 객체입니다. 문자열 리터럴은 string 클래스 객체입니다. 문자열 리터럴을 변수에 할당하면 객체입니다. 

 

따라서 문자열 리터럴로 할당한 변수는 string 클래스 객체이니 문자열 클래스는 변경할 수 없다는 예시로 a = "123"은 변경 불가를 들 수 있습니다. 변경할 수 있는 자료형에는 리스트가 있습니다.

 

-> 변경 가능 여부 정보 확인하는 법

내장 클래스 중에 어떤 함수가 객체를 변경하는지 확인할 수 있습니다. 클래스에는 속성과 함수 등을 관리하는 namespace인 dict가 만들어집니다.

 

slow wrapper 들은 클래스 내부에 c로 만들어진 함수라는 것을 확인할 수 있습니다. dict를 출력하면 클래스 내부에 모든 함수가 나오며, __setitem__ 스페셜 메서드가 없으면 변경 불가 클래스입니다. str은 없지만 list는 있습니다. dir는 클래스 내부에 어떤 속성과 메서드가 있나 확인만 하는 것이고 dict는 관리하는 것입니다.

 

- 함수와 클래스의 문서화

모듈의 문서는 __doc__에 저장이 되어있습니다.

 

doc string으로 직접 문서화할 수도 있습니다. 

 

함수 내부에서 문서화를 할 수도 있습니다. 함수의 경우 첫 줄의 doc string을 붙여야 합니다.

 

- 변수에 값을 할당하는 문장

파이썬은 변수를 정의하면 namespace에 변수의 이름을 키로 객체를 value로 저장하게 됩니다. globals()로 dict 형태로 전역 namespace를 확인할 수 있습니다. 따라서 변수 이름을 키로 검색할 수 있습니다. func 함수를 정의하면 똑같이 namespace에 저장됩니다. 

 

- 조건 연산자를 스페셜 메서드로 처리하기

스페셜 메서드는 세세히 알 필요 없습니다. 목적만 알면 됩니다. 목적은 c언어로 작성된 파이썬이 임의로 넣어주는 규칙같은 것입니다. 파이썬의 모든 변수는 객체이므로 참조 연산자('.')로 접근할 수 있습니다.

 

- 함수

파이썬의 함수는 return문을 실행하지 않으면 None이 반환됩니다.

 

함수를 변수에 지정하면 역시 함수 객체가 생성됩니다. 함수 객체는 함수 클래스에 의해 관리되는 객체입니다. 함수의 클래스는 function 타입입니다. 함수를 호출하는 것은 f()이고 f는 function 타입의 instance입니다.

 

- help 알아보기

help도 하나의 클래스입니다. 인자로 받은 것의 __doc__을 조회해서 출력합니다.

 

 

- 클래스 정의하기

클래스명 뒤에 상속 클래스명을 지정하지 않으면 Object 클래스가 기본으로 상속됩니다. 클래스 내부에는 인스턴스 메서드, 정적 메서드, 속성 등이 올 수 있습니다.

 

- 클래스의 스페셜 메서드

1) 객체의 스페셜 메서드

1] __class__로 객체가 자신을 생성한 클래스 정보

2] __dict__로 객체 내부 속성을 볼 수 잇습니다.

 

 

2) 클래스의 스페셜 메서드

1] __dict__로 내부에 클래스 수준 정적 속성과 인스턴스 메서드를 볼 수 있습니다. pass만 작성하더라도 4개가 기본으로 존재합니다. dict는 namespace를 관리하는데 객체와 클래스가 namespace가 달라 표시되는 것이 다릅니다.

2] __module__은 이 클래스가 작성된 py 파일인 모듈의 이름을 나타냅니다.
3] __name__으로 클래스 이름을 볼 수 있습니다.

 

- 객체의 속성과 인스턴스 메서드

객체의 속성은 객체의 namespace에서 관리하고 인스턴스 메서드와 클래스 속성은 클래스 namespace에서 관리합니다. 어떻게 클래스를 작성할 때 구분되어 들어가는 지 알아봅니다.

 

__init__ 생성자 내부에 속성을 정의합니다. 생성자도 인스턴스 메서드인데 인스턴스 메서드를 정의할 때 첫 번째 매개변수는 항상 self입니다. self는 객체 자기 자신을 의미하며, 다른 클래스 타입을 넣을 수도 있습니다. 그리고 객체를 생성할 때 인자로 name을 넣어서 생성자 내부에서 속성을 초기화할 수 있습니다. 자바에서 생성자로 초기화하는 것과 같은 모습입니다.

 

게터나 세터도 역시 인스턴스 메서드이므로 self를 첫 번째로 사용합니다. 생성자에 매개변수가 있는 클래스의 경우 self를 제외한 매개변수와 매핑되게 생성자에 인자를 넣어줘야 합니다. 객체의 속성을 확인하기 위해 dict를 사용해보면 객체의 __dict__로 속성을 확인할 수 있습니다. 클래스의 __dict__를 해보면 인스턴스 메서드가 정의되어 있습니다.

 

속성에 접근하기 위해서는 자바와 동일하게 너무도 당연하게 게터로도 접근할 수 있고 속성에 직접 접근할 수도 있습니다.

 

- 클래스 내부의 클래스 속성 정의

객체 속성이 아닌 클래스 속성을 알아봅니다. 생성자 밖에 속성을 정의하면 정적 클래스가 됩니다. 자바에서는 static을 붙여야 클래스 속성인데 파이썬은 생성자 밖에만 있으면 클래스 수준의 속성입니다.

 

__dict__를 해보면 객체는 객체 속성이 나오고 클래스는 클래스 수준 속성이 나옵니다. 클래스와 객체의 namespace가 다르기 때문입니다.

 

클래스로 속성을 참조하면 클래스 속성이 나오고 객체로 속성을 참조하면 객체 속성이 나옵니다.

 

클래스는 객체를 생성하기 전에 이미 메모리에 할당이 되어야 하기 때문에 자바에서 static 변수를 일반 메서드에 사용할 수 없는 것처럼 파이썬에서도 일반 메서드에 클래스 속성을 쓸 수 없습니다.

Comments