카테고리 없음

[파이썬] 파이썬 메타 클래스는 무엇에 유용합니까?

행복을전해요 2021. 1. 7. 09:14

메타 클래스 는 "특별한 사용자 정의 동작"을 갖춘 클래스 개체 (클래스 개체의 인스턴스 와 반대)를 갖기를 원할 경우 필수 불가결합니다 . 개체의 동작은 개체 유형 에 대한 특수 메서드에 의존 하고 클래스 개체의 유형은 정확히 메타 클래스의 동의어.

예를 들어, "print X"가 "Time is now 8:46 am"(오전 8시 46 분 또는보다 일반적으로 현재 시간)을 방출하는 클래스 객체 X를 원하는 경우 이는 type(x)(AKA X의 메타 클래스) X와 Y가 모두 클래스 객체 인 경우 또는 (여기서 X는 클래스 객체 인 경우) __str__식에 의미를 부여하려는 경우와 유사하게 (다양한 적용 가능한 특수 메서드와 함께) 특수 사용자 지정 메서드가 있습니다 . 기타 등등.X + YX[23]

대부분의 다른 사용자 정의 작업은 이제 (Python 2.6 이상에서) 클래스 데코레이터로 구현하기가 더 쉬워지며, class이 끝난 직후에 클래스 객체를 변경할 수 있습니다 . 변경이 효과를 가지려면 (예 : 설정 또는 변경 __slots__) 변경이 매우 일찍 이루어져야하기 때문에 이것이 실현 불가능한 경우가 몇 가지 더 있습니다 .

Python 3에서 메타 클래스는 약간의 유용성을 추가로 얻습니다. 이제 메타 클래스는 class명령문의 본문을 실행하는 동안 채워질 매핑 개체를 선택적으로 지정할 수 있습니다 (기본적으로 일반 dict). 이렇게하면 클래스 본문의 이름 바인딩 순서 를 보존하고 사용할 수 있습니다 (일반적으로 dict는 순서를 잃는 동안 ). 이는 클래스가 특정 순서로 "필드"를 가져야 할 때 (예 : 1 : 1 매핑) C struct, CSV 파일 또는 DB 테이블의 행 등)-Python 2. *에서는 중복으로 지정해야했습니다 (일반적으로 시퀀스이므로 순서를 유지하는 추가 클래스 속성 사용). Python 3 메타 클래스를 사용하면 중복을 제거 할 수 있습니다.

-------------------

프로그래밍에 추가적인 유연성을 추가하십시오.

그러나 Python의 Metaclass 프로그래밍에 따르면 필요하지 않을 수도 있습니다 (아직)

메타 클래스는 99 %의 사용자가 걱정해야 할 것보다 더 깊은 마법입니다. 당신이 그것들이 필요한지 궁금하다면, 당신은 필요하지 않습니다 (실제로 그것들을 필요로하는 사람들은 그것들이 필요하다는 것을 확실히 알고 있고, 이유에 대한 설명이 필요하지 않습니다).

-파이썬 전문가 팀 피터스

-------------------

저는 메타 클래스를 약간의 빈도로 사용하며 도구 상자에 포함 할 수있는 매우 강력한 도구입니다. 때로는 문제에 대한 솔루션이없는 것보다 코드가 적을수록 더 우아하고 코드가 적을 수 있습니다.

메타 클래스를 가장 자주 사용하는 것은 클래스 생성 중에 클래스 속성을 사후 처리하는 것입니다. 예를 들어, name적절한 경우 객체에 속성을 설정합니다 (예 : Django ORM의 작동 방식).

class AutonamingType(type):
    def __init__(cls, name, bases, attrs):
            for k,v in attrs.iteritems():
                        if getattr(v, '__autoname__', False):
                                        v.name = k
                                        
                                        class Autonamer(object):
                                            __metaclass__ = AutonamingType
                                            

이것을 도구로 사용하고 있고 name그것을 알기 전에 알아야하는 클래스를 사용하고 있다면 do_something():

class Foo(object):
    __autoname__ = True
        def __init__(self, name=None):
                self.name = name
                    def do_something(self):
                            if self.name is None:
                                        raise ValueError('name is None')
                                                # now, do something
                                                

나머지 코드에서 다음과 같이 차이를 만들 수 있습니다.

class Bar(object):
    myfoo1 = Foo('myfoo1')
        myfoo2 = Foo('myfoo2')
            myfoo3 = Foo('myfoo3')
            

이:

class Baaz(Autonamer):
    myfoo1 = Foo()
        myfoo2 = Foo()
            myfoo3 = Foo()
            

따라서 중복 (및 변수 이름과 할당 된 이름이 동기화되지 않을 가능성)을 줄입니다.

-------------------

메타 클래스 메커니즘을 사용하는 예제를 찾고 있다면 django.forms 의 소스 코드를 읽을 수 있습니다 .

폼 정의의 선언적 스타일은 메타 클래스를 통해 구현됩니다.

-------------------

거의 필요하지 않지만 객체의 기본 동작에 동작을 추가하려는 곳에서 유용합니다. Aspect Oriented Programming 또는 Hibernate와 같은 지속성 프레임 워크에서 수행 된 계측을 비교합니다.

예를 들어 각각의 새 개체를 유지하거나 기록하는 클래스를 원할 수 있습니다.

-------------------

아마도 메타 클래스로만 할 수있는 일은 없을 것입니다. 그러나 어떤 사람들에게는 (내가 포함 된) 당신이 사용할 수있는 흥미로운 도구입니다. 까다로울 수 있으므로 남용하지 않도록주의하십시오.

예를 들어, 저는 최근 프로젝트에서 메타 프로그래밍을 사용했습니다. OpenOffice 계산 시트로, 일부 pyUNO 매크로를 사용하여 정보가있는 일부 파일을 생성합니다. 사용자에게 채울 정보를 제공하는 시트가 하나 있었고 다른 시트는 요소의 종류와 속성을 설명하는 데 사용할 수 있습니다. 그런 다음 사용자는 요소 수와 각각의 유형을 선택하고 파일을 생성 할 수 있습니다. 매크로는 각 시트의 구성에 따라 메타 프로그래밍을 통해 클래스를 생성합니다. 그런 다음 사용자는 각 클래스를 인스턴스화하고 개체를 생성 할 수 있습니다.

메타 프로그래밍 없이도 할 수 있지만, 메타 프로그래밍 기능을 사용하는 것이 당연해 보였습니다.

-------------------

Django 소스를 살펴보십시오. 예를 들어 메타 클래스는 모델을 생성하는 데 사용됩니다.

http://code.djangoproject.com/wiki/DynamicModels

내부적으로 Django는 메타 클래스를 사용하여 소스 코드에서 제공하는 클래스를 기반으로 모델을 만듭니다. 너무 많은 세부 사항을 다루지 않고, 이는 클래스가 실제 모델이 아니라 Django가 클래스에 대한 설명을 수신하여 그 자리에 모델을 생성하는 데 사용함을 의미합니다.

-------------------

첫 번째 해설자는 여기 에서 메타 클래스의 사용이 (많은) '일'동안 발생했던 예기치 않은 오류를 추적하는 데 도움이되는 '보석'이라고 말했습니다.



출처
https://stackoverflow.com/questions/2005878