티스토리 뷰

9.4. 기타 주의사항들

  • 데이터 어트리뷰트는 같은 이름의 메소드 어트리뷰트를 덮어쓴다.

  • 명명법

    • 메소드 이름은 대문자로 시작
    • 데이터 어트리뷰트는 언더스코어(_) 하나를 붙인다.
    • 메소드에는 동사를 쓴다.
    • 데이터 어트리뷰트에는 명사를 쓴다.
  • 함수 객체를 클래스의 지역 변수로 대입하는 것 역시 가능하다.

    # Function defined outside the class
    def f1(self, x, y):
        return min(x, x + y)
    
    class C:
        f = f1
    
        def g(self):
            return 'hello world'
    
        h = g
  • f, g, h는 모두 함수 객체를 가리키는 클래스 C의 어트리뷰트이고, 결과적으로는 이것들 모두 C의 인스턴스의 메소드이다.

9.5. 상속

  • 상속은 아래와 같이 생겼다.

    class DerivedClassName(BaseClassName):
      # statement-1
      # .
      # .
      # .
      # statement-N
  • BaseClassName자리에 다른 모듈에서 가져온 클래스를 쓸 수도 있다.

    class DerivedClassName(modename.BaseClassName):
  • 파생 클래스는 베이스 클래스의 메소드들을 재정의할 수 있다.
  • 메소드가, 같은 객체의 다른 메소드를 호출할 때 특별한 권한이 필요하지 않다.(모든 메소드는 실질적으로 C++의 virtual과 같다.)
  • 파이썬에는 상속과 함께 쓸 수 있는 두 개의 내장 함수가 있다.
    • 인스턴스의 형을 검사하려면 isinstance()를 사용한다.
      isinstance(obj, int)obj.__class__가 int거나 int에서 파생된 클래스인 경우에만 True를 리턴한다.
    • 클래스 상속을 검사하려면 issubclass()를 사용한다.
      issubclass(bool, int)True인데, boolint의 서브 클래스이기 때문이다. 하지만 issubclass(float, int)False인데, floatint의 서브 클래스가 아니기 때문이다.

9.5.1. 다중 상속

  • 파이썬은 다음과 같이 다중 상속도 지원한다.

    class DerivedClassName(Base1, Base2, Base3):
        pass

9.6. 비공개 변수

  • 객체 내부에서만 액세스할 수 있는 "비공개" 인스턴스 변수는 파이썬에 존재하지 않는다.

  • 하지만 대부분의 파이썬 코드에서 따르고 있는 규약이 있다. : 밑줄로 시작하는 이름은 (예를 들어, _spam) API의 공개적이지 않은 부분으로 취급되어야 한다. (하지만 접근하려면 쉽게 접근 가능)

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

    • 비공개처럼 취급하고 싶지만 굳이 접근 하자고 한다면, 해당 어트리뷰트의 이름은 외부에서 접근할 때 _classname__attribute로 치환된다.
  • x라는 클래스 어트리뷰트 중 _a__b라는 변수가 존재한다고 가정할 때, _ax._a로 손 쉽게 접근이 가능하다. __b변수에 접근할 때에는 이름 뒤섞기 매커니즘에 의해 x.__b라는 커맨드로 접근이 불가능하고, x._x__b라는 커멘드로 접근이 가능하다.

 

Reference: 파이썬 자습서

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함