2020년 6월 3일
[파이썬] 클래스 (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