[파이썬] 클래스 (Class) 정의

I. 클래스 정의

머리부– 예약어 class 클래스명 (상속 클래스명)
– 기본 상속은 항상 object 클래스가 됨
몸체부– 클래스의 데이터인 속성 (Attribute)
– 객체를 생성할 때 속성을 정의하는 초기화 함수
– 객체와 클래스의 행위를 표현하는 함수들 (인스턴스 / 클래스 / 정적 메소드)
  • [예제] 클래스 정의
class Car(object) : # 클래스 머리부
    pass            # 클래스 몸체부

c = Car()           # 클래스 객체 생성

print(c.__class__)  # 이 객체를 만든 클래스 확인
print(Car.__name__) # 클래스 이름 확인

[결과]
<class '__main__.Car'>
Car

 
II. 클래스 객체 생성 시 속성과 인스턴스 메소드 추가

  • 파이썬에서 객체의 속성은 객체의 이름공간에서 관리하지만, 인스턴스 메소드는 클래스 이름공간에서 관리
  • [예제] 클래스 내 인스턴스 속성과 메소드 적용
class Car(object) :
    def __init__(self, name) :
        self.name = name

    def getName(self) :
        return self.name

    def setName(self, name) :
        self.name = name

c = Car("Super Car")

print(c.__dict__)   # 객체의 이름 공간 확인
print(Car.__dict__) # 클래스 이름 공간 확인
print()
print(c.getName)    # 객체가 클래스의 함수 이름에 접근 시 메소드가 됨
print(c.getName())  # 메소드 실행 시 self는 자동 설정
print(c.name)       # 객체의 속성에 직접 접근
print()
c.setName("BUS")    # 메소드 처리 시 하나의 인자만 전달
print(c.name)

[결과]
{'name': 'Super Car'}
{'__module__': '__main__', '__init__': <function Car.__init__ at 0x03735148>, 'getName': <function Car.getName at 0x03735100>, 'setName': <function Car.setName at 0x037350B8>, '__dict__': <attribute '__dict__' of 'Car' objects>, '__weakref__': <attribute '__weakref__' of 'Car' objects>, '__doc__': None}

<bound method Car.getName of <__main__.Car object at 0x03711F58>>
Super Car
Super Car

BUS

 
III. 클래스 내부 속성 정의

  • 클래스 내 이름 정의, 값 할당 시 속성으로 인식
  • [예제] 클래스 속성 정의
class Car(object) :

    name = "Super Car"
    def __init__(self, name) :
        self.name = name

    def getName(self) :
        return self.name

    def setName(self, name) :
        self.name = name

c = Car("BUS")

print(c.name)   # 객체 name 속성
print(Car.name) # 클래스 name 속성

[결과]
BUS
Super Car

 
IV. 콜러블(Callable)

  • 호출 가능한 경우 항상 클래스 내부 객체를 호출할 수 있는 스페셜 메소드(__call__) 존재
  • [예제] 콜러블 확인
import collections.abc as abc   # 자료구조 모듈 내 추상 클래스 모듈

print(abc.Callable) # 호출을 처리하는 추상 클래스

print(abc.Callable.__abstractmethods__)     # 상속하려면 __call__ 반드시 구현

print(isinstance(sum, abc.Callable))        # 추상 클래스와의 생성 관계 확인
print(issubclass(type(sum), abc.Callable))  # 함수 클래스와 추상 클래스의 상속 관계 확인

[결과]
<class 'collections.abc.Callable'>
frozenset({'__call__'})
True
True
  • 함수는 객체이므로 추상 클래스와의 관계를 isinstance 함수로 확인 시 True, 이것은 함수 클래스가 추상 클래스 Callable을 상속해서 스페셜 메소드 __call__을 구현한것임
  • 이 함수 클래스를 type으로 조회하여 추상 클래스 Callable 과의 상속 관계를 issubclass 함수로 확인 시 True

 

[참고]

  • 잇플, “한 권으로 개발자가 원하던 파이썬 심화 A to Z”, 2019.11

콘텐츠 사용 시 출처 표기 부탁 드리고, 댓글은 큰 힘이 됩니다^^