>  기사  >  백엔드 개발  >  Python 메타클래스를 사용하는 방법

Python 메타클래스를 사용하는 방법

php中世界最好的语言
php中世界最好的语言원래의
2018-04-09 15:57:021572검색

이번에는 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 &#39;int&#39;>
>>> type(s)
<class &#39;str&#39;>
>>> type(nums)
<class &#39;list&#39;>
>>> type(dicts)
<class &#39;dict&#39;>

객체의 유형도 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 &#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의 유형은 유형

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

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

现在我们都知道类(对象)可以使用 class 关键字创建,我们还知道类(对象)的类型是 type,既然知道了它的类型是 type,那么肯定可以通过 type(元类)来创建。

用元类创建类

前面讲到过,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(类名,基类元组(可以为空), 属性字典)

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Python实现求解最大公约数的方法

在python中numpy与array应该怎样转换

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

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