Python에서 메타클래스 생성 및 사용

高洛峰
풀어 주다: 2017-03-01 13:47:36
원래의
1460명이 탐색했습니다.

Python에서는 type 함수를 사용하여 메타클래스를 동적으로 생성할 수 있습니다. 또한 __metaclass__ 속성을 사용하여 메타클래스를 지정할 수도 있습니다. 다음으로 Python에서 메타클래스의 생성 및 사용을 설명하는 구체적인 예를 제공하겠습니다.

메타클래스를 사용하면 특정 클래스가 생성되는 방식을 정의할 수 있습니다. 기본적으로 클래스 생성 방법을 제어할 수 있습니다.
메타클래스도 클래스, 타입 클래스입니다.

메타클래스는 일반적으로 클래스를 생성하는 데 사용됩니다. 클래스 정의를 실행할 때 인터프리터는 이 클래스에 대한 올바른 메타클래스를 알아야 합니다. 이 속성이 정의되지 않은 경우 상위 클래스에서 __metaclass__ 속성을 찾습니다. 아직 찾지 못한 경우 전역 변수를 찾으세요.

기존 클래스의 경우 메타클래스는 type.ClassType입니다.

또한 메타클래스에는 세 가지 매개변수(클래스 이름, 기본 클래스에서 상속된 데이터 튜플, 클래스 속성 사전)를 전달하는 생성자가 있습니다.
다음으로 클래스를 작성할 때 클래스에 __str__() 메서드를 제공해야 하는 메타클래스를 정의합니다. __repr__() 메서드가 제공되지 않으면
에서 경고를 표시합니다.

아아앙

Python에서 메타클래스 생성 및 사용



유형

type 함수는 다음과 같은 변수의 유형을 확인할 수 있습니다.

from warnings import warn
#元类需要继承type类
class ReqStrSugRepr(type):
  def __init__(cls, name, bases, attrd):
  #构造函数需要传递的参数为类名,基类,类属性字典
    super(ReqStrSugRepr, cls).__init__(name, bases, attrd)
    # 判断__str__字符串是否在类的属性字典里
    if '__str__' not in attrd:
      raise TypeError('Class requires overriding of __str__()')

    if '__repr__' not in attrd:
      warn('Class suggests overriding of __repr__()\n', stacklevel=3)

class Foo(object):
  #给类指定元类 
  __metaclass__ = ReqStrSugRepr

  def foo(self):
    pass
#这一段代码不用创建类来测试,直接运行一下就会报错,可见元类的功力。
로그인 후 복사

type 함수는 새 객체를 생성할 수도 있습니다
type은 name, bases, dict라는 세 가지 매개변수를 허용합니다. 첫 번째 매개변수는 클래스 이름을 허용하고, 두 번째 매개변수는 상위 클래스(튜플 형식)를 허용하며, 세 번째 매개변수는 속성과 메서드(사전 형식)를 허용합니다.

# <type &#39;int&#39;>
# <type &#39;str&#39;>
type(1)     
type(&#39;mink&#39;)
로그인 후 복사

함수를 받는 메소드는 다음과 같습니다

X = type(&#39;X&#39;, (object,), dict(a=1))
# 等于
class X(object):
  a = 1
로그인 후 복사

메타클래스

us 클래스를 통해 인스턴스 객체를 생성할 수 있고, 클래스 객체를 생성하는 클래스가 메타클래스라는 것은 우리 모두 알고 있습니다. Type은 클래스 객체를 생성할 수 있습니다. 이는 유형이 메타클래스임을 의미합니다.

metaclass 속성

메타클래스를 사용하여 클래스 객체를 생성하려면 객체에 __metaclass__ 속성을 추가해야 합니다. 물론 메타클래스를 통해 클래스의 일부 기능을 수정할 수 있도록 먼저 메타클래스

def say(self):
  print &#39;hello&#39;

X = type(&#39;X&#39;, (object,), dict(say=say))
x = X()

# pirnt hello
x.say()
로그인 후 복사

가 있어야 합니다. 위의 내용은 변수를 다음과 같이 수정하는 것입니다.

Python의 메타클래스 생성 및 사용과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!