본문 바로가기
Python/파이썬 기초

클래스(class)의 상속(inheritance)과 비공개변수 - 파이썬 기초(25)

by 콩돌 2019. 1. 8.
반응형

참고 자료

https://docs.python.org/ko/3/tutorial/classes.html



파이썬 버전 3.7 기준



파이썬에서의 클래스 상속과 비공개 변수


본 포스팅에서 다루는 내용은 다음과 같다.

클래스의 상속, 다중상속, 비공개 변수 등.



클래스(Class)의 상속

  ○ 클래스 상속은 클래스의 핵심 기능으로 상위 클래스의 기능을 하위 클래스가 받는 기능을 의미한다. 


클래스 상속의 형태 정의

  ○ 클래스의 상속을 하는 형식은 다음과 같이 나와 있다.

    ▷ 클래스의 기본 정의에서 괄호를 추가하여 BaseClass를 입력받는다.

    ▷ BaseClass는 하위클래스에 입력하는 상위클래스이다. 타 모듈의 클래스도 import 되어있다면 입력이 가능하다.

    ▷ InheritedClass는 새로 정의하는 하위클래스로써 상위클래스의 변수와 기능을 계승받는다.


  ○ 상속하였을 시에 하위 클래스의 인스턴스는 상위 클래스의 어트리뷰트에 접근이 가능하다.


  ○ 상위 클래스의 변수나 메서드를 하위클래스에서 아예 재정의하는 것도 가능하다.

    ▷ 그냥 단순하게 같은 이름의 변수나 메서드를 하위 클래스에 다른 내용(같은 내용이어도 상관 없으나 그러면 굳이 재정의할 필요가 없다.)으로 작성하면된다.


클래스 상속의 형식)

class InheritedClass(BaseClass):

    내용



클래스 다중상속의 형태 정의

  ○ 파이썬은 다중상속도 지원하며, 아래 다중 상속의 사용 형식이 나와있다.

    ▷ 위에서 상속할 때와 거의 동일하나, 여러 상위 클래스를 입력한다는 점만 다르다.

  ○ 상위클래스를 상속받을때 순서는 왼쪽에서 오른쪽 즉 BaseClass1부터 시작하여 차례대로 입력받는다.

    ▷ 즉, 하위 클래스의 인스턴스에서 어떤 어트리뷰트를 사용할 때, 사용되는 어트리뷰트를 제일 먼저 InheritedClass에서 찾고 만약 없을 경우 BaseClass1에서 찾고 없으면, BaseClass2에서 찾는 순서로 진행되어 어트리뷰트를 찾을 때까지 마지막 상위클래스까지 검색을 수행한다.


클래스 다중 상속의 형식)

class InheritedClass(BaseClass1, BaseClass2, BaseClass3, ...):

    내용



상위클래스의 어트리뷰트에 접근하는 다양한 방법

  ○ 하위 클래스를 작성할 때, 상위 클래스의 어트리뷰트에 접근해야할 필요가 있을 경우 크게 2가지 방법으로 접근이 가능하다.


  ○ 첫째로, 상위클래스를 직접 이름을 넣어 접근하는 방법이 존재한다.

    ▷ 이러한 접근 방법을 활용하면 상위 클래스의 메서드 기능을 확장시키는 것이 용이하다.


상위클래스의 이름을 직접 입력하는 것을 통한 어트리뷰트 접근 형식)

class InheritedClass(BaseClass1, BaseClass2, BaseClass3, ...):

    ...

    ... BaseClass1.Variable1 ...

    ... BaseClass1.Method1(input) ...

    ...


  ○ 둘째로, super() 함수를 이용하여 접근하는 방법 역시 존재한다.

    ▷ https://kongdols-room.tistory.com/37에 super() 함수에 대한 간략한 설명이 존재한다.


super()함수를 이용한 어트리뷰트 접근 형식)

class InheritedClass(BaseClass1, BaseClass2, BaseClass3, ...):

    ...

    ... super().Variable1 ...

    ... super().Method1(input) ...

    ...



기타 클래스 상속과 관련된 내장함수

  ○ 인스턴스형 및 클래스 상속을 검사하기 위해 아래와 같은 함수가 사용될 수 있다.

    ▷ 인스턴스형을 검사하기 위해서 isinstance()를 사용할 수 있다.
    ▷ 클래스 상속을 검사하기 위해선 issubclass()를 사용할 수 있다.
    ▷ 위 함수들은 https://kongdols-room.tistory.com/37 에 간략히 설명되어 있다.



클래스의 비공개 변수

  ○ 파이썬에서는 기본적으로 객체 내부에서만 접근이 가능한 비공개 인스턴스라는 개념이 존재하지 않는다.

  ○ 하지만 언더스코어(_)로 시작하는 어트리뷰트는 공개적이지 않는 것처럼 취급되어야 한다.

    ▷ 비공개라는 개념이 없기 때문에 굳이 접근을 하고자 한다면 쉽게 접근이 가능하다.

  ○ 두개의 언더스코어(__)를 사용할 경우 비공개처럼 보여지기 위해 이름 뒤섞기(name mangling)이라고 불려지는 메커니즘에 의해 이름이 뒤섞이게 된다.

    ▷ 사실 비공개처럼 취급하고는 싶지만 굳이 접근하고자 한다면, 해당 어트리뷰트의 이름은 외부에서 접근할 때에는 _classname__attribute로 치환된다.


  ○ 아래 비공개 변수에 대한 예제가 있다.

    ▷ "x"이라는 클래스의 어트리뷰트 중 "_a"와 "__b"이라는 변수가 존재하는 경우를 가정해본다.

    ▷ "x._a" 커멘드로 클래스의 어트리뷰트에 쉽게 접근이 가능하다.

    ▷ __b 변수에 접근할때에는 이름 뒤섞기 메커니즘에 의해 "x.__b"라는 커멘드로 접근이 불가능하다. 하지만  "x._x__b"라는 커멘드로 접근이 가능하다.


사용 예)

In[15]: class x:

      ...:     _a = 10

      ...:     __b = 20

      ...:

In[16]: x._a

Out[16]: 10

In[17]: x._b

AttributeError: type object 'x' has no attribute '_b'

In[18]: x._x__b

Out[18]: 20


반응형

댓글