본문 바로가기
Python Object-oriented Programming

type Class

by 자동매매 2023. 4. 1.

Introduction to the Python type class

 

파이썬에서 class는 class type 객체입니다. 예를 들어, 다음은   가지 메서드 __init__ greeting 사용하여 Person 클래스를 정의합니다.

 

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greeting(self):
        return f'Hi, I am {self.name}. I am {self.age} year old.'

 

Person 클래스는  다음 문과 같이 class type 개체입니다.

 

print(type(Person))

Output:

<class 'type'>

 

Person 클래스는 class type  인스턴스입니다.

 

print(isinstance(Person, type))

 

파이썬은 클래스 type 사용하여 다른 클래스를 만듭니다. class type자체는 호출 가능 클래스입니다.

다음은 type class 생성자 하나를 보여 줍니다.

 

type(name, bases, dict) -> a new type

 

생성자에는 클래스를 만들기 위한 개의 매개 변수가 있습니다.

 

  • name  : 클래스의 이름(Person).
  • bases : 새 클래스의 기본 클래스를 포함하는 튜플(object,).
                 예를 들어, Person은 object 클래스에서 상속되면
  • dict    : 클래스 네임 스페이스

 

기술적으로는 type 클래스를 사용하여  클래스를 동적으로 만들 있습니다. 이를 수행하기 전에 Python 클래스를 만드는 방법을 이해해야합니다.

파이썬 인터프리터가 코드에서 클래스 정의를 발견하면, 다음을 수행합니다:

 

  1. class body를 문자열로 추출합니다.
  2. 클래스 네임스페이스를 위해 클래스 dictionary를 만듭니다.
  3. 따라서 class body를 실행하여 클래스 dictionary를 채우십시오.
  4. 위의 type() 생성자를 사용하여 type의 새 인스턴스를 만듭니다.

 

위의 단계를 에뮬레이트하여 Person 클래스를 동적으로 만들어 보겠습니다.

 

class_body = """
def __init__(self, name, age):
    self.name = name
    self.age = age

def greeting(self):
    return f'Hi, I am {self.name}. I am {self.age} year old.'
"""                                                            # <1>
class_dict = {}                                                # <2>
exec(class_body, globals(), class_dict)                        # <3>
Person = type('Person', (object,), class_dict)                 # <4>

 

# exec() 함수는 class body를 실행하고 전역 클래스 네임스페이스를 채웁니다.

# Person 클래스이며 객체이기도합니다. Person 클래스는  object 클래스에서 상속되며,

   class_dict의 네임스페이스를 갖습니다.

 

 

다음은 type 클래스 Person 클래스의  type 보여 줍니다.

 

<class 'type'>

 

Person class type 인스턴스입니다.

 

print(isinstance(Person, type))

 

Output:

 

True

 

class_dict __init__ , greeting 함수를 갖는다

 

{'__init__': <function __init__ at 0x0000024E28465160>,
 'greeting': <function greeting at 0x0000024E28931550>}

 

pprint(Person.__dict__)는 다음의 함수를 포함한다.

 

mappingproxy({'__dict__': <attribute '__dict__' of 'Person' objects>,
              '__doc__': None,
              '__init__': <function __init__ at 0x00000165F7725160>,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'Person' objects>,
              'greeting': <function greeting at 0x00000165F7F71550>})

# from pprint import pprint 필요

 

예제에서 Python  코드에서 정적으로 정의하는 것과 동일한 class type 동적으로 생성합니다.

type 클래스 다른 클래스를 만들기 때문에 종종 메타 클래스라고 합니다. 메타 클래스는 다른 클래스를 만드는 사용되는 클래스입니다.

 

Summary

  • 파이썬에서 하나의 클래스는그 class type의 인스턴스입니다.
  • type 클래스는 다른 클래스를 생성하므로 메타 클래스라고 합니다.

'Python Object-oriented Programming' 카테고리의 다른 글

Metaclass Example  (0) 2023.04.01
Metaclass  (0) 2023.04.01
Abstract Class  (0) 2023.03.31
super() Method  (0) 2023.03.31
Static Methods  (0) 2023.03.31

댓글