이번에는 Python의 메타클래스 사용법과 Python 메타클래스 사용 시 주의사항에 대해 알려드리겠습니다. 실제 사례를 살펴보겠습니다.
오늘 내 임무는 메타클래스가 무엇인지 철저히 이해하는 것입니다. 살펴보겠습니다.
메타클래스를 이해하려면 객체부터 시작해 보겠습니다.
Object (Object)
Python 모든 것이 객체입니다. 이 문장을 들어보셨을 것입니다(지금 들어보셨을 것입니다). 숫자는 객체, string은 객체, 목록 는 객체이고 사전은 객체입니다. 예:
>>> i = 10 >>> s = "abc" >>> nums = [1,2,3] >>> dicts = {"name":"zhang"}
등호의 오른쪽은 객체이고 왼쪽은 이러한 객체에 지정된 이름입니다. 모든 객체에는 ID, 값이라는 세 가지 주요 속성이 있습니다. , 입력합니다.
식별
식별은 개인의 신분증 ID와 동일합니다. 각 개체에는 고유한 ID 식별이 있으며 이는 라이프 사이클 동안 변경되지 않습니다. 컴퓨터 메모리 주소. 객체의 ID는 id() 함수를 통해 확인할 수 있습니다.
>>> id(i) 40592592 >>> id(s) 44980584
객체 값
객체의 두 번째 속성은 값입니다. 예를 들어 i 값은 10, s 값은 abc, nums 값입니다. 1,2,3입니다.
Type
객체의 또 다른 중요한 속성은 유형입니다. 모든 객체는 해당 유형으로 구성됩니다. 예를 들어 위의 i 유형은 int 유형으로 구성됩니다. 정수. s 유형은 문자열 유형, nums 유형은 목록 유형, dicts 유형은 모두 해당 유형으로 구성됩니다.
type()을 통해 객체의 유형을 확인할 수 있습니다.
>>> type(i) <class 'int'> >>> type(s) <class 'str'> >>> type(nums) <class 'list'> >>> type(dicts) <class 'dict'>
객체의 유형도 ID 식별자와 동일합니다. 일단 결정되면 변경되지 않습니다.
클래스 및 (인스턴스) 객체
정수 유형, 문자열 유형, 목록 및 시스템에서 정의한 기타 유형 외에도 키워드로 정의된 자체 유형을 만들 수도 있습니다. 수업 . 예:
>>> class Person: # 这里的 self 指某个实例对象自己 ... def init(self, name): # name 是实例的属性 ... self.name = name # live 是类的属性 live = True
여기의 Person 클래스는 추상 템플릿입니다. 이제 이 클래스를 호출하여 특정 실제 인물을 구성(인스턴스화)할 수 있습니다. 명명된 개체가 나오는데, 이 개체를 인스턴스 개체라고 합니다.
>>> p1 = Person("zhangsan") >>> p1.name 'zhangsan' >>> >>> p2 = Person("lisi") >>> p2.name 'lisi'
여기서 p1과 p2는 인스턴스화 후의 (인스턴스) 객체입니다. 이 두 객체의 유형은 Person 클래스입니다. 클래스와 (인스턴스) 객체 간의 관계는 차량 금형과 같습니다. 자동차도 마찬가지다.
>>> p1 <main.Person object at 0x0195AA30> >>> type(p1) <class 'main.Person'> # 这里的main是模块名称
클래스도 객체입니다(클래스 객체라고도 함)
지금 우리는 모든 것이 객체이고, 인스턴스(실제 자동차)도 객체이고, 클래스(몰드)도 물론 객체라고 말했습니다.
Python 인터프리터가 키워드 클래스 명령을 실행하면 내부적으로 "Person"이라는 클래스가 생성됩니다. 이 클래스도 클래스 객체라고 합니다(인스턴스 간의 차이점에 유의하세요. ). 객체)에는 ID, 유형 및 값도 있습니다. 예를 들면 다음과 같습니다.
>>> id(Person) 26564024 >>> type(Person) <class 'type'> >>> Person <class 'main.Person'>
우리는 이 Person 클래스 객체의 유형이 "type"이라고 불리는 것을 확인했습니다. 이는 Person 클래스가 유형별로 생성된다는 것을 의미합니다. 이제 p1과 p2는 인스턴스 객체이고 Person은 인스턴스 객체라는 것을 기억해야 합니다. 클래스 객체. 게다가 이 유형은 대체 무엇일까요?
복습하자면, 인스턴스 객체 p1의 유형은 클래스 객체 Person이고, Person의 유형은 유형
>>> nums = [1,2,3] >>> type(nums) <class 'list'> >>> type(list) <class 'type'>
nums는 목록이고, 목록의 유형도 유형이고, 사전 클래스(dict)의 유형도 유형입니다. 모든 클래스의 유형은 모두 유형이므로 모든 클래스가 유형별로 생성된다는 의미입니다. 이 유형이 메타 클래스입니다. Tao는 하나를 낳고, 하나는 두 개를 낳고, 세 개는 모든 것을 생성합니다. (메타클래스 자체도 객체입니다)
现在我们都知道类(对象)可以使用 class 关键字创建,我们还知道类(对象)的类型是 type,既然知道了它的类型是 type,那么肯定可以通过 type(元类)来创建。
用元类创建类
前面讲到过,type 有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。
>>> Person = type("Person", (), {"live":True}) >>> Person <class 'main.Person'>
Person 就是一个类,它等价于:
>>> class Person: ... live = True ... >>> Person <class 'main.Person'>
用元类 type 创建类的语法是:
type(类名,基类元组(可以为空), 属性字典)
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 Python 메타클래스를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!