C#/Java와 유사한 인터페이스에 대해 이야기하는 경우 대답은 간단합니다. 정적으로 입력 된 언어에 속하며 실제로 Python과 같은 동적 언어에는 적용되지 않는 개념입니다.
평범한 파이썬 접근법은 필요한 개체를 신뢰하고 필요한 특성을 가지고 있다고 가정합니다. 그렇지 않으면 호출자에게 처리되거나 남아있을 수있는 런타임 오류가 발생할 수 있습니다. 이는 언어의 일반적인 동적 특성과 일치합니다. 문제가 발생하면 런타임에이를 나타낼 수 있습니다.
Java 또는 C#의 인터페이스는 컴파일 중에 필요한 전제 조건 (즉, 특정 메소드가있는 객체)을 확인하기위한 수단입니다. 이것은 (틀림없이) 컴파일 타임 검사의 안전성을 높이기 위해 런타임 유연성을 일부 상쇄합니다.
인터페이스의 개념에 동적 유형 지정 언어가 없다는 것을 의미하는 것은 아닙니다. 사실, 파이썬은 "메타 타입 (iterables)"과 같이 약간의 모호한 개념을 가지고 있습니다.
def process_sequence(seq):
if not hasattr(seq, '__iter__'):
seq = [seq] # turn single element into iterable
for elem in seq:
process_element(elem)
이것은 개념적으로 Go 언어의 비 명시 적 인터페이스와 유사합니다. 자신 만의 반복 가능을 원할 경우 을 구현할 것이라고 명시하지 않고 (List
클래스에서 상속받을 Java와 마찬가지로) __iter__
메소드를 구현하면됩니다. 누구든지 객체가 실제로 반복 가능한지 여부를 확인하려는 경우 실제로 "__iter__
메서드"를 갖는 "계약"이 충족되는지 여부를 확인할 수 있습니다. 이것은 앤 로니 쿠스가 그들의 대답에서 묘사 한 것입니다.
뻔뻔한 플러그로서, 내가 구현하고있는 pyduck 라이브러리를 지적 할 수 있습니다. 그것은 그러한 "계약"(리플렉션을 통해)의 검증을 단순화 (그리고 어쩌면 표준화)하고 좀 더 신뢰성있게 만드는 것을 목표로합니다.
정확히 무엇을 찾고 있는지 잘 모르겠습니다. 템플릿과 제네릭은 완전히 다른 것입니다 (T4 템플릿과 같은 뜻입니까?) 파이썬에서하고 싶은 것을 C# 샘플로 제공 할 수 있습니까? – Davy8
나는 OP가 C++ 템플릿, Java/C# generics의 원래 영감을 의미한다고 말하고 싶습니다. –
C++ 템플릿은 제네릭보다 훨씬 더 많습니다. 이것은 OP가 C++ 템플릿에 관해서 이야기 할 때 아래 답변을 무효화합니다. 나는 그렇게 생각하지 않는다. 단지 C#이 언급 되었기 때문이며, "템플릿/제네릭"이라는 구절은 OP가 실제로 그 차이를 인식하지 못한다고 제안한다. – delnan