type()을 사용하여 클래스를 동적으로 생성
클래스도 객체이기 때문에 프로그램이 실행되는 동안 클래스를 생성할 수 있습니다. 파이썬은 동적 언어입니다. 동적 언어와 정적 언어의 가장 큰 차이점은 함수와 클래스의 정의가 컴파일 타임에 정의되는 것이 아니라 런타임에 동적으로 생성된다는 점입니다. 앞서 우리는 먼저 type() 함수를 이해했습니다.
먼저 새로운 hello.py 모듈을 생성한 다음 Hello 클래스를 정의합니다.
class Hello(object): def hello(self, name='Py'): print('Hello,', name)
그런 다음 다른 모듈에서 hello 모듈을 참조하고 해당 정보를 출력합니다. type() 함수는 유형과 변수의 유형을 보는 데 사용됩니다.
#!/usr/bin/env python3 # -*- coding: UTF-8 -*- from com.twowater.hello import Hello h = Hello() h.hello() print(type(Hello)) print(type(h))
출력 결과는 무엇인가요?
Hello, Py <class 'type'> <class 'com.twowater.hello.Hello'>
위에서 언급했듯이 type() 함수는 유형이나 변수의 유형을 확인할 수 있습니다. Hello는 클래스이고 유형은 유형이며 h는 인스턴스이며 유형은 com.twowater.hello.Hello 입니다. 이전 com.twowater는 내 패키지 이름이고 hello 모듈은 이 패키지 이름 아래에 있습니다.
여기서 더 생각해 보세요. 위의 예에서는 type() 함수를 사용하여 유형이나 변수의 유형을 확인합니다. Hello 클래스의 유형이 확인되고 인쇄된 결과는 <class 'type'>입니다. 실제로 type() 함수는 객체의 유형을 반환할 수 있을 뿐만 아니라 새로운 유형을 생성할 수도 있습니다. 클래스의 정의는 런타임 시 동적으로 생성되며, 클래스를 생성하는 방법은 type() 함수를 사용하는 것입니다. 예를 들어 위 예제에서는 type() 함수를 통해 Hello 클래스를 생성할 수 있습니다. 자세한 내용은 다음 코드를 참조하세요.
# -*- coding: UTF-8 -*- def printHello(self, name='Py'): # 定义一个打印 Hello 的函数 print('Hello,', name) # 创建一个 Hello 类 Hello = type('Hello', (object,), dict(hello=printHello)) # 实例化 Hello 类 h = Hello() # 调用 Hello 类的方法 h.hello() # 查看 Hello class 的类型 print(type(Hello)) # 查看实例 h 的类型 print(type(h))
출력 결과는 다음과 같습니다.
Hello, Py <class 'type'> <class '__main__.Hello'>
여기서 먼저 생성 방법을 이해해야 합니다. type() 함수를 통한 클래스 객체. 매개변수 설명:
1. 예제의 Hello와 같은 클래스 이름. 2. Python은 다중 상속만 지원합니다. 하나의 상위 클래스인 경우 튜플은 단일 요소로 작성되어야 합니다. 예제에서는 객체 클래스를 상속합니다. 단일 요소 튜플이므로 (object,)
3로 작성됩니다. 예제에서 printHello 함수는 메소드 이름 hello
에 바인딩됩니다. 구체적인 패턴은 다음과 같습니다.
type(클래스 이름, 상위 클래스의 튜플(상속을 위해 비어 있을 수 있음), 사전 포함 속성(이름 및 값))
자, 구체적인 매개변수 사용법을 이해한 후 출력을 살펴보겠습니다. 결과적으로 type() 함수를 통해 생성된 클래스가 클래스를 작성하는 것과 완전히 동일하다는 것을 알 수 있습니다. 왜냐하면 Python 인터프리터가 클래스 정의를 만나면 클래스 정의의 구문을 스캔한 다음 type() 함수를 호출하여 Out of class를 생성하기 때문입니다.
그러나 일반적으로 우리는 클래스를 정의하기 위해 클래스 ***... 메소드를 사용하지만, type() 함수를 사용하면 클래스를 생성할 수도 있습니다. 즉, 동적 언어 자체는 런타임 중에 클래스의 동적 생성을 지원하는데, 이는 정적 언어의 런타임 중에 클래스를 생성하려면 소스 코드 문자열을 구성한 다음 컴파일러를 호출해야 합니다. , 또는 일부 도구를 사용하여 단어를 생성합니다. 섹션 코드 구현은 본질적으로 동적 컴파일이므로 매우 복잡할 수 있습니다.
Python에서는 클래스도 객체이며 클래스를 동적으로 생성할 수 있다는 것을 알 수 있습니다. 실제로 이것은 키워드 class를 사용할 때 Python이 뒤에서 수행하는 작업이며 이는 메타클래스를 통해 달성됩니다.