2011-09-27 3 views
6

나는 C# 프로그래머로 몇 달 동안 일했고 객체가 어떻게 생성되었는지 신경 쓰지 않고 라이브러리에 전달할 수있는 generics/templates 인터페이스에 익숙해졌습니다.파이썬에는 C#/Java 스타일 인터페이스가 있습니까?

필자는 Python으로 비교적 큰 프로젝트를 시작하려고합니다. (필자는 파이썬을 많이 작성했지만 주로 데이터 분석 등을위한 코드를 작성했습니다.) 유사한 개념이 있는지 궁금합니다. 이 언어로? 나는 그것에 대한 인터넷 검색을 시도하고 많이 올라 오지 못했습니다.

대답이 '아니오'라면 괜찮습니다. 그렇다면 사람들은 대체 무엇을 대신합니까?

+0

정확히 무엇을 찾고 있는지 잘 모르겠습니다. 템플릿과 제네릭은 완전히 다른 것입니다 (T4 템플릿과 같은 뜻입니까?) 파이썬에서하고 싶은 것을 C# 샘플로 제공 할 수 있습니까? – Davy8

+0

나는 OP가 C++ 템플릿, Java/C# generics의 원래 영감을 의미한다고 말하고 싶습니다. –

+0

C++ 템플릿은 제네릭보다 훨씬 더 많습니다. 이것은 OP가 C++ 템플릿에 관해서 이야기 할 때 아래 답변을 무효화합니다. 나는 그렇게 생각하지 않는다. 단지 C#이 언급 되었기 때문이며, "템플릿/제네릭"이라는 구절은 OP가 실제로 그 차이를 인식하지 못한다고 제안한다. – delnan

답변

5
인터페이스의 나의 이해는 자바에서, 그래서 희망이 당신이 무슨 뜻인지 충분히 가까이되는

...

파이썬은 dynamic typing을 사용하기 때문에 특정 객체 메소드 및 필드 세트가 주장 할 구문 방법은 없습니다

/ duck typing. 당신은 객체를 특정 방법 또는 필드가 있는지 여부를 확인하려면 다음을 수행 할 수 있습니다

  • Dig into it with reflection (이것은 대부분의 작품이다) 당신은 모든 자사의 __dict__ (사전에 원하는에 대한
  • 확인 개체의 멤버). MyObj.__dict__.hasKey(o)은 당신이 원하는 것입니다. (매우 쉽다)
  • 당신, 당신의 동료 개발자들 또는 당신의 사용자가 당신에게 적절한 객체를 주었다는 것을 믿고 객체를 사용하기 만하면된다. (쉽지만 위험한 최대)
  • 또는 위의 작업을 수행하고 try/except 블록으로 감 쌉니다. (이것은 자바 프로그래머에게 익숙 할 것입니다.)

파이썬에서 복잡한 클래스 집합을 설계하는 것은 C 언어와 같은 방식으로 수행하는 것과 매우 다른 경험이므로 불편을 끼칠 수있는 준비를하십시오 (위의 옵션 3과 유사). 행운을 빕니다!

+0

감사합니다 - 옵션 3이 나에게 유용하다는 것을 알았지 만 다른 팀원이 사용하지 않도록 설득 할 수 있다면 시도해 보겠습니다 :) 나머지도 유용합니다. 감사! – samb8s

+0

아마도 좋은 생각 일 겁니다. 나는 개인적인 일에 그렇게 많이하지만 아무리 잘못하면 아무도 죽거나 돈을 잃지 않을 것입니다. – andronikus

5

파이썬은 동적으로 입력되므로 (대부분의 경우) 제네릭/템플릿이 필요하지 않습니다.

15

대답이 '아니오'라면 괜찮습니다. 그렇다면 사람들은 대체 무엇을 대신합니까?

Duck Typing.

중요한 것은 C#의 기술 수하물을 제거하여 파이썬에 접근하는 것입니다.

파이썬을 언어로 학습하십시오. 파이썬과 C#간에 개념을 매핑하지 마십시오. 그 방법은 광기를 속인다.


"인터페이스,하지 제네릭 또는 템플릿"

문제가되지 않습니다. 모든 정적 유형 선언 기술은 필요하지 않습니다. 그 문제에 대해서는 규칙을 깨기 위해 주조도 필요하지 않습니다.

3

zope.interface

그러나 대부분의 사람들은 그것을 사용하지 않습니다.

4

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 라이브러리를 지적 할 수 있습니다. 그것은 그러한 "계약"(리플렉션을 통해)의 검증을 단순화 (그리고 어쩌면 표준화)하고 좀 더 신뢰성있게 만드는 것을 목표로합니다.

관련 문제