>  기사  >  백엔드 개발  >  Python 메타클래스 인스턴스 분석_python

Python 메타클래스 인스턴스 분석_python

不言
不言원래의
2018-04-04 16:14:291182검색

이 글에서는 주로 Python 메타클래스 인스턴스 분석을 소개합니다. 이 글의 주요 임무는 메타클래스가 무엇인지 모든 사람에게 철저하게 설명하는 것입니다. 도움이 필요한 친구들이 이를 참조할 수 있습니다.

Gui 삼촌이 Python을 발명하고 여기에 여러 가지 개념을 통합했습니다. . 이 언어에서는 반복자, 데코레이터, 함수, 생성기, 클래스, 객체, 코루틴 등이 있습니다.

이런 개념 중 어느 것도 초보자가 이해하기 쉽지 않을 것 같지만, 이보다 더 어려운 개념이 있습니다. 우리가 직접적으로 사용하는 경우는 거의 없지만 매일 사용하고 있는 Python 세계의 창시자입니다. 오늘의 주인공 ------ 메타클래스.

오늘 내 임무는 메타클래스가 무엇인지 철저히 이해하는 것입니다. 살펴보겠습니다.

메타클래스를 이해하려면 객체부터 시작해 보겠습니다.

Object(객체)

Python 모든 것이 객체입니다. 이 문장을 들어보셨을 것입니다(지금 들어보셨을 것입니다). 숫자는 객체, 문자열은 객체, 목록은 객체입니다. , 사전은 객체입니다. 예:


>>> i = 10
>>> s = "abc"
>>> nums = [1,2,3]
>>> dicts = {"name":"zhang"}


등호의 오른쪽은 객체이고 왼쪽은 이러한 객체에 지정된 이름입니다. 모든 객체에는 ID라는 세 가지 주요 속성이 있습니다. , 값 및 유형입니다.

식별

식별은 사람의 신분증 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 &#39;int&#39;>
>>> type(s)
<class &#39;str&#39;>
>>> type(nums)
<class &#39;list&#39;>
>>> type(dicts)
<class &#39;dict&#39;>


객체의 유형도 ID 식별자와 동일하며 결정된 후에는 변경되지 않습니다.


클래스 및 (인스턴스) 객체

시스템에서 이미 정의한 정수 유형, 문자열 유형, 목록 및 기타 유형 외에도 자체 유형을 생성하고 키워드 class를 사용하여 정의할 수도 있습니다. 예:

>>> class Person:
  # 这里的 self 指某个实例对象自己
...  def __init__(self, name):
   # name 是实例的属性
...   self.name = name
  # live 是类的属性
  live = True


여기의 Person 클래스는 Zhang San 또는 Li Si를 참조하지 않는 추상 템플릿입니다. 이제 이 클래스를 호출하여 구성(인스턴스화)할 수 있습니다. 구체적이고 실제 이름이 붙은 개체가 나오는데, 이 개체를 인스턴스 개체라고 합니다.


>>> p1 = Person("zhangsan")
>>> p1.name
&#39;zhangsan&#39;
>>>
>>> p2 = Person("lisi")
>>> p2.name
&#39;lisi&#39;


여기서 p1과 p2는 인스턴스화 후의 (인스턴스) 객체입니다. 이 두 객체의 유형은 Person 클래스입니다. 그 관계는 실제 자동차가 만들어지는 것과 같습니다.


>>> p1
<__main__.Person object at 0x0195AA30>
>>> type(p1)
<class &#39;__main__.Person&#39;> # 这里的__main__是模块名称



클래스도 객체입니다(클래스 객체라고도 함)

지금 우리는 모든 것이 객체이고, 인스턴스(실제 자동차)는 객체이고, 클래스(몰드)는 객체라고 말했습니다. Python 인터프리터가 키워드 클래스 명령어를 실행하면 내부적으로 "Person"이라는 클래스가 생성됩니다. 우리는 이를 클래스 객체라고 부릅니다. 인스턴스 객체의 차이점) ID 식별, 유형 및 값도 있습니다. 예:

>>> id(Person)
26564024
>>> type(Person)
<class &#39;type&#39;>
>>> Person
<class &#39;__main__.Person&#39;>


우리는 이 Person 클래스 객체의 유형이 "type"이라는 것을 알았습니다. 이는 Person 클래스가 유형별로 생성된다는 것을 의미합니다. 이제 p1과 p2가 인스턴스라는 것을 기억해야 합니다. , Person은 클래스 객체입니다. 게다가 이 유형은 대체 무엇일까요?


검토해 보겠습니다. 인스턴스 객체 p1의 유형은 클래스 객체 Person이고, Person의 유형은 type

>>> nums = [1,2,3]
>>> type(nums)
<class &#39;list&#39;>
>>> type(list)
<class &#39;type&#39;>


nums는 목록이고, 목록의 유형도 유형이며, 사전 클래스의 유형입니다. (dict)도 유형이며, 모든 클래스의 유형은 유형입니다. 즉, 모든 클래스가 유형별로 생성된다는 의미입니다. 이 유형이 메타 클래스입니다. Tao는 하나를 낳고, 하나는 두 개를 낳고, 세 개는 모든 것을 생성합니다. (메타클래스 자체도 객체입니다)


이제 우리는 클래스(객체)가 클래스 키워드를 사용하여 생성될 수 있다는 것을 모두 알고 있습니다. 유형이 유형이면 유형(메타클래스)을 통해 생성될 수 있어야 합니다.

메타클래스를 사용하여 클래스 만들기

前面讲到过,type 有一个作用是用于检查对象的类型,其实它还有另外一个作用就是作为元类动态地创建类(对象)。


>>> Person = type("Person", (), {"live":True})
>>> Person
<class &#39;__main__.Person&#39;>


Person 就是一个类,它等价于:


>>> class Person:
...  live = True
...
>>> Person
<class &#39;__main__.Person&#39;>


用元类 type 创建类的语法是:

type(类名,基类元组(可以为空), 属性字典)

总结

以上所述是小编给大家介绍的 Python 元类实例解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!


相关推荐:

Python解析JSON的实例分享

分析Python解析XML的几种方式


위 내용은 Python 메타클래스 인스턴스 분석_python의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.