은 사람을 사용하여 메타-메타-클래스/meta-meta-meta-클래스에서는 파이썬/은 다른 언어로 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/476586

문제

나는 최근에 발견 메타클래스에서는 python.

기본적으로 metaclass 에서는 파이썬은 클래스를 만드는 클래스입니다.많은 유용한 이유는 당신이 원하는 것이 이를 수행-모든 종류의 클래스를 초기화 한 예입니다.등록 클래스에서 공장,복잡한 유효성 검사의 속성을 변경하는 방법을 상속품,등등.이 모든 것이 되지만 가능하지만 간단합니다.

하지만에서는 python,메타클래스는 또한 일반됩니다.그래서 저는지 궁금하는 경우 추상화 수용 가서 더 높은,그리고 내가 보기에는 그것을 할 수 있습과는:

  • a metaclass 에 해당하거나를 구현하는 역할을하는 패턴으로(에 GOF 패턴용어)를 대응하고 있습니다.
  • 메타-metaclass 은 패턴 자체(면 우리는 그것을 만드는 튜플의를 나타내는 클래스가 추상적인 역할보다는,단지 하나의 클래스)
  • meta-meta-metaclass 가 패턴 공장, 에 해당하는 GOF 패턴 그룹,예를 들어,생성,구조,행동.공장할 수 있는 사건의 설명 특정 유형의 문제점 그래서 당신은 당신의 클래스는 그것을 해결했다.
  • meta-meta-meta-metaclass(으로 지금까지 갈 수 있었다)는, 패턴 공장 공장, 공장할 수 있는 아마의 유형을 설명하고 그것은 당신에게 본 공장을 묻는다.

내가 찾은 어떤 재료에 대한 온라인,하지만 대부분은 매우 유용되지 않습니다.하나의 문제는 다른 언어로 정의하는 메타클래스에 따라 약간 다릅니다.

다른 사람이 사용되는 메타클래스에이처럼 python/elsewhere,또는 본 사용되는 야생에서 또는 그것에 대해 생각?무엇이 다른 언어로 analogues?E.g.에서는 C++얼마나 깊은지할 수 있는 템플릿을 재귀를 갈까?

고 그것을 연구니다.

도움이 되었습니까?

해결책

SmallTalk의 수업 시스템은 흥미로운 연구입니다. SmallTalk에서는 모든 것이 객체이며 모든 객체에는 클래스가 있습니다. 이것은 계층 구조가 무한대로 진출한다는 것을 의미하지 않습니다. 내가 정확하게 기억한다면, 그것은 다음과 같은 것입니다.

5-> 정수 -> 정수 클래스 -> metaclass-> metaclass class-> metaclass-> ... (It loops)

여기서 '->'는 "의 인스턴스입니다.

다른 팁

이것은 어떤 사람들이 "패턴의 일반적인 구현"을 만들고있는 영원한 퀘스트를 떠올리게합니다. 객체를 만들 수있는 공장처럼다른 공장을 포함하여), 또는 실제로 관리하기에 훨씬 더 복잡한 일반 목적 의존성 주입 프레임 워크. 하다 무엇.

Zend Framework 프로젝트를 관리 할 때 배꼽 공연의 지점에 대한 사람들의 의도를 다루어야했습니다. 나는 아무것도하지 않는 구성 요소를 만들기 위해 많은 제안을 거절했으며, 패턴이 목표를 목표로하는 수단 대신 그 자체로 목표 인 것처럼 GOF 패턴의 마법의 구현 일뿐입니다.

추상화에 대한 수익이 줄어드는 점이 있습니다. 약간의 추상화는 훌륭하지만 결국 유용한 일을하는 코드를 작성해야합니다.

그렇지 않으면 그것은 단지입니다 거북이 끝까지.

당신의 질문에 대답:no.

무료 느낌을 연구한다.

그러나,당신이 융 디자인 패턴(는 아이디어)코드(이 구현됩니다.)

좋은 코드를 반영하의 번호를 맞물리는 디자인 패턴이 있습니다.쉬운 방법은 없을 위한 공식화하다.당신이 할 수 있는 최고 좋은 그림,음성 docstrings 및 메서드 이름을 반영하는 다양한 디자인 패턴이 있습니다.

또한 메타 클래스 클래스입니다.는 반복입니다.이 없는 높은 수준의 추상화.그 시점에서,그것은 단지도 있었습니다.의 아이디어는 메타-메타-클래스를 의미하지 않는 많은--그것의 메타-클래스를 위한 메타 클래스,바 그러나 기술적으로 가능합니다.그것은 단지 모든 클래스,그러나입니다.


편집

"는 클래스 메타클래스를 만들 정말 너무 바보 같은?어떻게 그들의 유틸리티를 갑니까?"

클래스를 만드는 클래스는 괜찮습니다.는 꽤 많이 있습니다.는 사실상 클래스 메타 클래스 또는 추상적이 수퍼 클래스 또는 콘크리트 클래스에 상관 없습니다.메타클래스들에게 클래스입니다.그들은 다른 메타클래스,이상되는,그러나 그들은 여전히 메타클래스를 만들기 클래스입니다.

유틸리티"갑자기"밖으로 실행이 없기 때문에 실제적인 것은 당신이 필요합니다(또는 작성할 수도 있습)에 metaclass 는 또 다른 metaclass.그것은 없는 것"그것은 갑자기"가 바보입니다.그것은 아무것도 없다는 것을 유용한다.

나는 씨앗을 연구니다.예를 들어,실제로 쓰기 metaclass 는 빌드를 다른 metaclass.재미 있습니다.뭔가가있을 수 있습 유용한다.

점 OO 쓰 클래스 정의는 현실 세계 entities.이와 같이 metaclass 은 때로는 편리한을 정의하는 간단면의 여러 가지에 관련 클래스입니다.(그것은 방법은 어떤 측면을 지향 프로그래밍입니다.) 는 모든 metaclass 수 있습니다 정말 하;그것은 장소를 보유 몇 가지 기능, __new__(), 없는,적당한 부분의 클래스 자체.

Simon Peyton Jones는 2007 년 프로그래밍 언어 컨퍼런스의 역사에서 Haskell이 유형 클래스를 사용하여 메타 프로그래밍을 허용하지만 실제로 거북이가 내려 졌다고 언급했습니다. Haskell에서 메타 메타-메타 메타 ETC 프로그램을 메타 메타 메타 ETC 프로그램을 할 수는 있지만 3 개 이상의 간접적 인 간접을 사용하는 사람은 누구도 들어 본 적이 없습니다.

Guy Steele은 LISP와 계획에서 동일한 것을 지적했습니다. 백 틱과 evals를 사용하여 메타 프로그래밍을 수행 할 수 있지만 (백틱을 파이썬 람다라고 생각할 수 있습니다), 그는 3 개 이상의 백티크를 본 적이 없습니다.

아마도 그들은 당신이나 내가 가진 것보다 더 많은 코드를 보았을 것입니다.

당신이 그것에 대해 생각한다면, 대부분의 사람들은 메타 프로그래밍을 사용하지 않으며 두 레벨은 머리를 감싸기가 매우 어렵습니다. 나는 세 사람이 거의 불가능하다고 생각하고, 마지막으로 4 명을 시도한 사람은 망명으로 끝났다.

파이썬에서 메타 클라스를 처음 이해했을 때, 나는 "메타 메타 수업으로 무엇을 할 수 있을까?" 이것은 적어도 10 년 전입니다. 이제 몇 달 전에는 실제로 "메타 메타"클래스와 관련된 파이썬 클래스 제작에 하나의 메커니즘이 있다는 것이 분명해졌습니다. 그러므로, 그것에 대해 약간의 용도를 상상하려고 노력할 수 있습니다.

파이썬에서 객체 인스턴스화를 요약하려면 : 평범한 기능을 호출하는 데 사용되는 동일한 구문으로 클래스를 "호출"하여 Python의 객체를 인스턴스화 할 때마다 클래스의 클래스 __new__ 그리고 __init__. 클래스에서 이러한 방법의 호출은 "오케스트레이션"이 정확히 Class'Metaclass "입니다. __call__ 방법. 일반적으로 파이썬으로 메타 클라스를 쓸 때 __new__ 또는 __init__ 메타 클래스의 방법은 사용자 정의됩니다.

따라서 "메타 메타"클래스 1을 작성함으로써 ITS를 사용자 정의 할 수 있음이 밝혀졌습니다. __call__ 방법 및 따라서 어떤 매개 변수가 전달되는지 및 메타 클래스의 제어 __new__ 그리고 __init__ 방법, 그리고 그 후에 다른 코드가 호출되는 경우. 결국 밝혀진 것은 Metcalsses 자체가 일반적으로 하드 코딩되어 있으며 매우 큰 프로젝트에서도 몇 가지만 필요하다는 것입니다. 따라서 "메타 메타"호출에서 수행 될 수있는 모든 사용자 정의는 일반적으로 메타 클래스 자체에서 직접 수행됩니다.

그리고 그들, 파이썬 메타 클래스에 대한 다른 덜 빈번한 용도가 있습니다. __add__ 메타 클래스가 정의하는 클래스가 "중독"되도록 메소드로, 두 개의 클래스를 슈퍼 클래스로 추가하는 파생 클래스를 만듭니다. 이 메커니즘은 메타 클라스에도 완벽하게 유효합니다. 따라서 "실제 코드를 가지고 있습니다."클래스 선언에 추가하여 클래스를 추가하여 "메타 클라스"를 작성할 수있는 "메타 메타"클래스의 예를 따릅니다. :

class MM(type):
    def __add__(cls, other):
        metacls = cls.__class__
        return metacls(cls.__name__ + other.__name__, (cls, other), {})

class M1(type, metaclass=MM):
    def __new__(metacls, name, bases, namespace):
        namespace["M1"] = "here"
        print("At M1 creation")
        return super().__new__(metacls, name, bases, namespace)

class M2(type, metaclass=MM):
    def __new__(metacls, name, bases, namespace):
        namespace["M2"] = "there"
        print("At M2 creation")
        return super().__new__(metacls, name, bases, namespace)

그리고 우리는 대화식 콘솔에서 작업하는 것을 볼 수 있습니다.

In [22]: class Base(metaclass = M1 + M2): 
    ...:     pass
    ...: 
At M1 creation
At M2 creation

파이썬의 다른 중량체는 일반적으로 결합하기가 어렵 기 때문에, 이것은 전자의 부모로 명시 적으로 선언 할 필요없이 사용자가 만든 메타 클래스를 라이브러리 또는 stdlib와 결합 할 수있게함으로써 실제로 유용 할 수 있습니다.

In [23]: import abc

In [24]: class Combined(metaclass=M1 + abc.ABCMeta):
    ...:     pass
    ...: 
At M1 creation
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top