여니의 프로그래밍 study/파이썬

[#10 파이썬 기초] 객체와 클래스2

여니's 2021. 1. 8. 15:38

[#10 파이썬 기초] 객체와 클래스1 이어서 합니다!

모든것이 단순히 값이나,

하나의 정보가 아닌 객체로 취급하는 파이썬

객체는 어떠한 속성값과 행동을 가지고 있는 데이터입니다. (예시 자동차)


4. 자신 : self

- self 인수를 사용하는 이유?

: 적절한 객체의 속성과 메서드를 찾기 위해 사용한다.

 

a_car=Car()

a_car.exclaim()

# a_car 객체의 Car 클래스를 찾는다.

# a_car 객체를 Car 클래스의 exclaim() 메서드의 self 매개변수에 전달한다.

 


5. 속성 접근

- 파이썬은 객체 속성과 메서드가 공개되어 있어서 개발자가 스스로 잘 관리를 해야 한다.

 

1. 직접 접근

속성 값을 직접 가져와서 변경하는 방식은,

값이 언제든지 변경될 수 있다.

 

2. Getter/Setter 메서드

- 외부로부터 바로 접근할 수 없는 private 객체 속성을 지원하는데 private 속성의 값을 읽고 쓰기 위해 getter/setter 메서드를 사용한다.

- 파이썬에는 private 속성이 없지만 getter/setter 메서드로 조금의 프라이버시를 얻을 수 있다.

 

 

3. 속성 접근을 위한 프로퍼티

=> getter/setter 보다 더 좋은 방식

=> 속성 프라이버시를 위한 파이써닉한 방식이다.

 

1) name=property(get_name,set_name) 구문을 클래스 정의 마지막 줄에 정의한다.

속성 이름을 이용해서 hidden_name 속성을 가져오고 설정할 수 있게 되었다.

 

2) 데커레이터 추가하고 두 메서드 이름을 name으로 변경

getter 메서드 앞에 @property 추가

setter 메서드 앞에 @name.setter 데커레이터 추가

= > 객체에 저장된 속성을 참조하기 위해 name 프로퍼티를 사용

 

4. 계산된 값의 프로퍼티

- 프로퍼티는 계산된 값을 참조할 수도 있다.

-

속성에 대한 setter 프로퍼티를 명시하지 않는다면, 외부로부터 이 속성을 설정할 수 없다.

프로퍼티로 접근하면 이점이 있다.(직접 접근을 하는 것 보다)

=> 속성의 정의만 바꾼다면 모든 호출자를 수정할 필요가 없이 클래스 정의에 있는 코드만 수정하면 된다.

 

setter 프로퍼티 명시한 결과값

 

5. 프라이버시를 위한 네임 맹글링

- 파이썬은 클래스 정의 외부에서 볼 수 없도록 하는 속성에 대한 네이밍 컨벤션이 있다.

속성 이름 앞에 __(언더바를 두개 붙이면 된다.)

네임 맹글링은 속성의 의도적인 직접 접근을 어렵게 만든다.

 

6. 클래스와 객체 속성

- 클래스에 속성 할당이 가능하고 해당 속성은 자식 객체로 상속됌

- 자식 객체의 속성을 변경해도 클래스 속성에 영향 x

- 나중에 클래스 속성 변경해도 기존 자식 객체에는 영향 x

 


6. 메서드 타입

- 인스턴스 메서드 : 앞에 데커레이터가 없다. 첫 번째 인수는 객체 자신을 참조하는 self다

- 클래스 메서드 : @clasasmethod 데커레이터가 있다. 첫 번째 인수는 cls이고 클래스 자체를 참조한다.

- 정적 메서드 : @staticmethod 데커레이터가 있다. 첫 번째 인수는 자신의 객체나 클래스가 아니다.

 

1. 인스턴스 메서드

- 일반적인 클래스를 생성할 때의 메서드 타입이다. 

 

2. 클래스 메서드

- 클래스 전체에 영향을 미친다. 

 

3. 정적 메서드

- 클래스나 객체에 영향 x, 단지 편의를 위해 존재함.

 

 


7. 덕 타이핑

- 파이썬은 다향성을 느슨하게 구현했다.

(클래스에 상관 없이 같은 동작을 다른 객체에 적용할 수 있다는 말이다.)

 


8. 매직 메서드

- 비교 연산을 위한 매직 메서드

__eq__(self,other) === 271p 참고


9. 애그리게이션과 콤퍼지션

- 애그리게이션은 관계를 표현하긴 하지만 좀 더 느슨하다.


10. 객체는 언제 사용할까?

- 딕셔너리, 리스트, 튜플은 모듈보다 더 작고 간단하며 빠르다. 일반적으로 모듈은 클래스보다 더 간단하다.

- 객체보단 튜플이 더 낫고, getter/setter함수보단 간단한 필드가 더 낫다.

 


11. 네임드 튜플

- 네임드 튜플은 튜플의 서브클래스이다. 이름(.name)과 위치([offset])로 값에 접근할 수 있다.

튜플

duck 클래스를 네임드 튜플로, bill과 tail을 간단한 문자열 속성으로 변환한다.

 

딕셔너리에서 네임드튜플 만들기

**parts는 키워드 인수이다.

parts 딕셔너리에서 키와 값을 추출해서 Duck()의 인수로 제공한다.

 

- 네임드 튜플은 불변이다. 그러나 필드를 바꿔서 또 다른 네임드 튜플을 반환할 수 있따.

 

※ 네임드 튜플 특징 ※

1. 불변 객체처럼 행동함

2. 객체보다 공간 효율성과 시간 효율성이 더 좋다

3. 딕셔너리 형식의 대괄호 대신 온점 표기법으로 속성 접근 가능

4.; 네임드 튜플을 딕셔너리의 키처럼 사용 가능

 


12. 데이터 클래스

많은 개발자들은 메서드가 아니라 주로 데이터(속성)을 저장하기 위해 객체 생성하는 것을 선호한다.

-> 다음에 다시 공부하기 277p

 


13. attrs

279P

 

참고 문헌

: 처음 시작하는 파이썬