메타클래스란 무엇인가
위의 소개를 통해 드디어 막연하게 메타클래스로 가져왔습니다. 하지만 우리는 여전히 메타클래스가 무엇인지 모릅니다.
클래스를 생성할 때 대부분은 클래스의 인스턴스 객체를 생성하는 것입니다. 메타클래스는 어떻습니까? 메타클래스는 클래스를 생성하는 데 사용됩니다. 이를 이해하는 또 다른 방법은 메타클래스가 클래스 클래스라는 것입니다.
위의 type() 함수 소개를 통해 type() 함수를 통해 클래스를 생성할 수 있다는 것을 알 수 있습니다.
MyClass = type('MyClass', (), {})
사실 type() 함수는 메타클래스입니다. type()은 Python이 모든 클래스를 생성하기 위해 배후에서 사용하는 메타클래스입니다.
이제 왜 type() 함수가 Type이 아니라 type인지 짐작할 수 있을까요?
이것은 아마도 문자열 객체를 생성하는 데 사용되는 클래스인 str과 정수 객체를 생성하는 데 사용되는 클래스인 int와의 일관성을 위한 것입니다. type은 클래스 객체를 생성하는 클래스입니다. __class__ 속성을 검사하여 이를 확인할 수 있습니다. Python의 모든 것은 주의를 기울이십시오. 여기서는 모든 것을 의미하며 객체입니다. 여기에는 정수, 문자열, 함수 및 클래스가 포함됩니다. 그것들은 모두 객체이며 모두 클래스에서 생성됩니다.
# 整形 age = 23 print(age.__class__) # 字符串 name = '两点水' print(name.__class__) # 函数 def fu(): pass print(fu.__class__) # 实例 class eat(object): pass mEat = eat() print(mEat.__class__)
출력 결과는 다음과 같습니다.
<class 'int'> <class 'str'> <class 'function'> <class '__main__.eat'>
위의 모든 것, 즉 모든 객체가 클래스를 통해 생성되는 것을 볼 수 있으므로 __class__의 __class__는 무엇인지 궁금할 것입니다. 즉, 이러한 클래스를 생성하는 클래스는 무엇입니까?
위 코드를 기반으로 다음 코드를 계속 추가할 수 있습니다.
print(age.__class__.__class__) print(name.__class__.__class__) print(fu.__class__.__class__) print(mEat.__class__.__class__)
출력 결과는 다음과 같습니다.
<class 'type'> <class 'type'> <class 'type'> <class 'type'>
주의 깊게 관찰하고 다시 명확하게 설명하면 위 출력 결과는 정수 나이와 문자를 변경한다는 것입니다. 이름으로, 함수 fu와 객체 인스턴스 mEat에서 __class__의 __class__에 의해 인쇄된 결과입니다. 또한 수업이 수업의 결과를 인쇄한다고 말할 수도 있습니다. 인쇄된 클래스는 모두 유형인 것으로 확인되었습니다.
처음에 언급했듯이 메타클래스는 클래스의 클래스입니다. 즉, 메타클래스는 클래스 생성을 담당하는 것입니다. 또한 메타클래스가 클래스 생성을 담당한다는 것도 이해할 수 있습니다. 그리고 type은 내장된 메타클래스입니다. 즉, Python 자체의 메타클래스입니다.