파이썬 객체의 3가지 특징 상속성(inheritance), 다형성(polymorphism), 가시성(visibility)

1. 상속(inheritance)

 

부모 클래스의 속성과 행동을 그대로 물려받는 자식 클래스를 생성하는 기법

 

 

Person의 __init__ method를 Korean이 물려받아서

 

Korean이 속성을 가지지 않았음에도 불구하고

 

name,age를 가져서 출력해줌

 

 

super()는 부모 클래스를 뜻함

 

super().__init__(name,age)는 Person의 __init__을 그대로 가져오는거임

 

super().about_me(self.gender)도 마찬가지다.

 

그러나 부모의 gender는 사용자가 함수를 사용할 때 입력해야하지만

 

자식의 gender는 self.gender로 속성값을 그대로 가져온다

 

 

부모 a의 about_me에서는 gender를 입력받기 때문에 gender를 입력해줬지만

 

자식의 about_me에서는 gender를 입력받지 않아서 class의 속성값을 그대로 가져와서 출력했음

 

 

2. 다형성(polymorphism)

 

같은 이름 method의 내부 로직을 다르게 작성하는 경우

 

같은 목적을 가졌으나 다른 일을 하고 싶게 하는 경우

 

상속받을 때 주로 발생함

 

 

이름이 talk로 다 같은데 하고자하는건 어떤 문자열을 return하는 걸로 동일함

 

출력 내용이 다름

 

그렇지만 (특히 for문 순회할때) 이름을 다 다르게 작성하면 if조건문 써서 경우마다 다 다른 함수 이름으로 써줘야하니 비효율적

 

예를 들면 if animal == cat: animal.talk1()

 

if animal == dog: animal.talk2()

 

하지만 파이썬은 이런 불편함 없이 이름이 같아도 알아서 들어가서 맞는걸 사용해줌

 

 

3. 가시성(visibility)

 

객체의 정보를 볼 수 있는 레벨을 조절하는 것임

 

프로그램을 제품으로 판매할 시 소스를 보호한다거나 사용자가 괜히 잘못 수정하는 것을 방지하거나

 

필요없는 정보에 굳이 접근하지 못하게 한다던지 누구나 객체의 모든 정보를 볼 필요가 없음

 

encapsulation

 

정보 은닉

 

클래스 간 간섭의 최소화

 

축구선수가 심판 클래스의 가족 정보를 가져야하나?

 

3-1) private 변수 선언

 

 

위와 같이 아무렇게나 작성하면

 

인벤토리에 Product가 들어가야하는데 ‘abc’라는 의미없는 것이 들어감

 

 

self.__items로 private 변수를 선언함

 

그렇게 되면 위와 같이 items를 출력해도 에러나면서 접근할수가 없음

 

하지만 누군가는 사용하고 싶을 수도 있음

 

 

 

property 데코레이터를 이용하면 숨겨진 변수를 반환할 수 있게 해주는데

 

 

 

그러면 .__items로 접근하면 여전히 접근 불가능이지만

 

.items로 접근하면 접근가능하게 만들어줌

 

왜냐하면 .items를 하면 property 데코레이터가 지정한 def items 함수를 지정하기때문에

 

그 함수가 리턴하는 __items값을 리턴해주는거임

 

 

4. private 변수 추가 설명

 

real private 변수는 다른 언어와는 달리 파이썬에서는 존재하지 않는다

 

real private 변수는 아마 절대로 접근 못하는 private 변수를 말하는듯

 

파이썬의 하나의 문화?

 

 

몰랐는데 property decorator 말고 다른 decorator하면 접근할때 에러나더라

 

그리고 class 안에 집어넣어야함 class 밖에 decorator 쓰면 접근못하고 에러남

 

 

TAGS.

Comments