2016-09-06 2 views
0

파이썬에서 클래스의 인스턴스를 서브 클래 싱하는 목적은 무엇입니까? 다음은 예입니다 :클래스의 인스턴스를 슈퍼/기본 클래스로 사용하는 목적은 무엇입니까?

class A: 
    def __init__(*args): print(args) 

base = A() 


class Test(base): pass 

이 코드는 파이썬에서 제대로 작동하지만 base 클래스 A의 인스턴스 (1) 왜 우리는 클래스의 인스턴스를 서브 클래 싱해야합니까?메타 클래스와 관련이 있습니까? 이 질문에서

: What happens when you inherent from a module instead of a class in Python?

내가 Test(base)type(base).__init__이 될 것이라고 이해하고, (2) 이 정의 시간에 발생합니까, 클래스가 정의? (3) 파이썬은 base이 클래스의 인스턴스라는 것을 어떻게 알거나 결정합니까? type(base)type을 반환하지 않기 때문입니까?

+3

실제 생산 코드가 없습니까? 아니면 그냥 호기심입니까? –

+0

호기심과 기능에 대한 합리적인 사고 욕구 :-) – direprobs

+1

아니요, 'Test (base)'는'type (base) .__ init__ '이되지 않습니다. 그것은'type (base) .__ new__'가되며, 이는 다시'__init__'를 호출 할 수 있습니다. 그리고 예, 그것은 메타 클래스 때문입니다. –

답변

1

파이썬은 실제로 type(base)(classname, bases, body)을 사용하여 클래스 객체를 생성합니다. 이것은 (클래스가 특정 메타 클래스를 직접 지정하지 않는 한) 일반적인 메타 클래스 호출입니다. 인스턴스 (또는 너무 기본적 인스턴스 모듈) 용

, 즉 클래스 __new__ 정적 메소드는 새로운 인스턴스를 생성하는 수단을 호출하고, 그 새로운 인스턴스 __init__에 호출된다. 따라서 class Test(base): pass 구문의 경우, A의 새 인스턴스를 작성합니다 (파이썬이 class 문을 실행할 때).

이것은 실제로 '정의 시간'이 아닙니다. 파이썬 코드에는 그러한 단계가 없습니다. 파이썬은 모듈에 대한 바이트 코드를로드하고 처음으로 가져올 때이를 실행합니다. 이 때 모듈 상단의 클래스 문 (함수 내부가 아닌)이 실행됩니다. 그 당시에는 type(base)(...) 호출이 실행됩니다. 그렇습니다.

파이썬은 기본 클래스에 대해 '알지 못하거나'결정하지 않습니다. Python의 철학은 코드를 작성하는 개발자를 신뢰하는 것입니다. 가정은 자신이하는 일을 알고 있으며 기본 클래스는 마치 올바르게 응답 할 것처럼 취급됩니다. type(base)(....)이 예외를 발생시키지 않았기 때문에, Python은 계속되었습니다.

정말 메타 클래스로 호출 할 수있는 모든 것을 사용할 수 있습니다.

관련 문제