본문 바로가기

파이썬

type - Class에 대한 이해 1(Python)

1. 들어가기

다들 Python을 공부하면서 한번 쯤은 이런 말을 들어보았을 것이다.

Python의 모든 것은 객체이며, class 또한 어떤 class의 instance다.

그렇다면, class instance를 생성할 수 있게 해주는 어떤 class는 무엇일까?

 

Python은 Programing을 할 때, 객체 instance를 생성할 수 있는 class를 작성하기 위해 class 명령어를 사용한다.

class ParentClass:...
class NewClass(ParentClass):
    def __init__(self, *args, **kwargs) -> None:
    	...

    def method(self, *args, **kwargs) -> None:
    	...

print(NewClass, type(NewClass))
a = NewClass()
print(a, type(a))
<class '__main__.NewClass'> <class 'type'>
<__main__.NewClass object at 0x0000026E6E5BAF30> <class '__main__.NewClass'>

 

위와 같이 class 명령어로 생성한 NewClass는 출력하면 <class '__main__.NewClass'>라고 나온다.

하지만, NewClass의 type을 확인해보면 <class 'type'> 이라고 나온다.

반면, NewClass로 생성한 instance는 <__main__.NewClass object at 주소>로 나오며, type은 <class '__main__.NewClass'>로 나온다.

type을 쳤을 때 나오는 class가 변수 a에 저장된 instance를 생성할 때 사용한 class라는 의미이다.

 

그렇다면 NewClass는 type의 instance일까?

 

이를 알기 위해 type Class에 대해 알아보자.


2. type Class

type Class에 대한 이야기를 하기 전, 우선 코드를 작성해 보자.

# Python 자료형의 type 확인
print(type(1))
print(type("문자"))
print(type(0.1))
print(type(True))
print(type([]))
print(type((1,)))
print(type({}))
print(type({1}))
<class 'int'>
<class 'str'>
<class 'float'>
<class 'bool'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'set'>

위와 같이, 파이썬에서 사용하는 자료형의 type을 확인하는데 사용하는 함수로 type을 주로 사용한다.

하지만, vscode에서 사용하는 기본 python thema(Dark+)를 사용중이라면, type이 함수를 의미하는 노란색이 아니라 class를 의미하는 초록색으로 표시되는 것을 확인할 수 있다.

# Python 자료형의 type 확인
print(type(1))
print(type("문자"))
print(type(0.1))
print(type(True))
print(type([]))
print(type((1,)))
print(type({}))
print(type({1}))

이는 자료형을 변경하거나 생성하는 함수인 int, str, float, bool, list, tuple, dict, set에서도 동일하게 확인할 수 있다.

print(type(int),type(str),type(float),type(bool),type(list),type(tuple),type(dict),type(set))
print(type(int),type(str),type(float),type(bool),type(list),type(tuple),type(dict),type(set))
<class 'type'> <class 'type'> <class 'type'> <class 'type'> <class 'type'> <class 'type'> <class 'type'> <class 'type'>

출력해보면 결과는 모조리 <class 'type'> 으로 나온다.

print(type(type))를 수행해도, 심지어 모든 class가 자동으로 상속한다는 <class 'object'> 또한 print(type(object))를 수행해도 동일한 결과가 나온다.

print(type, type(type))
print(object, type(object))
<class 'type'> <class 'type'>
<class 'object'> <class 'type'>

이는 모든 class를 생성하는 class가 type class라는 결론을 유추해 볼 수 있을 것이다.


3. Type Class의 사용 방법

그럼 type class로 어떻게 class를 생성할 수 있을까?

def new_class_2_init(self, *args, **kwargs) -> None:
    print("NewClass2의 instance 생성")
    print(*args)
def new_class_2_method(self, *args, **kwargs) -> str:
    print("NewClass2의 method. 현재 기능 없음")
    return "리턴 동작 확인"
NewClass2 = type("NewClass2", (ParentClass,), {"__init__":new_class_2_init, "method":new_class_2_method})
print(NewClass2, type(NewClass2))
b = NewClass2("동작 확인")
print(b, type(b))
print(b.method())
<class '__main__.NewClass2'> <class 'type'>
NewClass2의 instance 생성
동작 확인
<__main__.NewClass2 object at 0x000002A98A4AB350> <class '__main__.NewClass2'>
NewClass2의 method. 현재 기능 없음
리턴 동작 확인

이런식으로 동일하게 class 생성이 가능하다.

1. arg1 --> name: str로 class의 이름

2. arg2 --> bases: tuple로 상속 받은 상위 class

3. arg3 --> namespace: dict[str, any]로 해당 클래스의 attributes와 methods를 의미한다.

del globals()["new_class_2_init"]
del globals()["new_class_2_method"]

위 명령어를 통해 global namespace에 함수마저 삭제하면 완전 동일한 구성이 된다.

 

다만, 이는 type의 __init__ method가 아닌 __new__ method로 인한 결과이다. 실제로 arg0에 cls로 type이 들어간다.

__init__과 __new__의 차이는 추후 metaclass를 공부하며 다뤄볼 예정이다.

 

 

'파이썬' 카테고리의 다른 글

인터페이스 (interface) in python  (0) 2021.11.13
추상클래스 (Abstract class) in python  (0) 2021.11.13
데코레이터 (Decorator) in python  (0) 2021.11.02