"Java OOP"와 "Pythonic OOP"의 차이점은 무엇입니까? [닫은]


19

ActionScript 2.0으로 시작한 다음 Java로 진행했습니다. 나는 그 이후로 파이썬 (아마도 내가 좋아하는 언어)을 포함하여 많은 언어를 배우거나 적어도 사용했습니다.

객체 지향 프로그래밍 스타일이 파이썬과는 달리 파이썬 Opy와 비슷한 Java OOP와 비슷합니다. Java와 Python OOP의 차이점은 무엇입니까? 파이썬에서 객체 지향 코드를 작성할 때 Java 프로그래머가 "비 파이썬 방식으로"수행하는 작업은 무엇입니까?

답변:


54

자바 녀석을 위해 파이썬은 누구나 클럽을 잡고 당신의 머리를 날려 버릴 수있는 무질서한 playgound입니다.

파이썬 녀석에게 Java는 Orwellian 우주이며, 우주가 어떻게 움직이는 지에 대한 다른 사람의 감소하는 시각에 끊임없이 얽매여 있습니다.

진실은 당신이 한 언어로 당신이 다른 언어로 깨끗하게 할 수있는 모든 것입니다. 그러나 당신이 언급 한 바와 같이, 깨끗한 것이 무엇을 의미 하는지에 대해서는 두 공동체에서 중요한 차이가 있습니다 .

Java 방식 : 깨끗한 시스템은 의도 된 것을 수행하고 다른 목적을 수행하지 않는 시스템으로, 의도 된 목적의 특성에 위배되는 확장 또는 수정을 허용하지 않으며 컴파일러를 통해 가능한 한 많이 시행합니다. 엄격한 구조 내에서 간단한 인터페이스를 신중하게 제작하여 유연성을 얻을 수 있습니다. Java에서는 샌드 박스가 항상 명확하게 묶여 있어야하며 컴파일러의 신속한 피드백으로 충족되어야합니다. Java는 객체 구조 를 정적으로 정의하고 인스턴스로부터 동적 상호 작용을 생성하는 수단을 제공 합니다. Java로 작업 할 때 나는 뇌가 죽은 솔루션을 향한 기본 빌딩 블록을 영리하게 만들려고합니다. 문제를 해결하는 방법에 대한 실무 이론이 있으면 대부분 상향식으로 작업합니다.

Java는 대규모 팀을 포괄 할 수있는 대규모 소프트웨어를 생산하는 경향이 있으며, 무리를 통제 할 수있는 도구와 수단을 제공합니다. 이 옵션을 선택하지 않으면 분리 된 팀이 더 불명확 한 목표를 향해 독립적으로 작업하게됩니다. 결국 각 팀은 자체 "레이 슨 디 트레"가되며 시스템 전체가 주요 프로젝트를 타락하여 희석 운전하게됩니다. 이로 인해 극한의 비용 초과와 성능이 좋지 않은 대규모 소프트웨어 시스템이 발생할 수 있습니다.

Java로 작업하는 빠르고 쉬운 방법은 거의 없지만 IDE와 툴링을 사용하면 몇 번의 클릭만으로 고통스러운 작업을 수행 할 수 있습니다.

파이썬 방식 : 정리는 간결하고 쉽게 읽을 수 있음을 의미합니다. 좋은 파이썬 시스템은 그 핵심에 바로 도달 할 수 있도록 설계되었으며 코드의 의도 된 용도와 목적을 코드에서 이해할 수있는 방식으로 가장 중요한 비밀을 드러냅니다. 또한 원래 디자인이 정확히 방향을 향하도록 확장 및 / 또는 캡슐화하여 자체 솔루션을 디자인 할 수 있습니다. 파이썬은 필요에 따라 인스턴스를 동적으로 변경할 수있는 객체 템플릿을 만드는 수단을 제공합니다. 파이썬에서는 문제를 즉시 해결 한 다음 최종 솔루션이 가능한 한 간단하고 읽을 수 있도록 논리적 구조로 코드를 확산시키는 경향이 있습니다. 파이썬에서는 하향식으로 작업하고 분할 및 정복 접근법을 통해 복잡성을 증가시키는 경향이 있습니다.

파이썬 팀은 가벼운 시스템을 만드는 경향이 있으며 작업 솔루션을 제공하는 데 매우 빠릅니다. 그들은 기회가있을 때마다 서로의 솔루션을 검증하는 시스템의 어느 부분에서나 상호 교환이 가능한 긴밀한 묶음 경향이 있습니다. 그들은 서로에게 먹이를주는 것은 매우 상쾌한 시너지를 창출합니다. 그러나 이것은 더 큰 시스템으로 확장하기가 어렵고 종종 일종의 유리 천장에 부딪 치는 팀을 만듭니다. 팀에 신입 사원을 소개하면 도움이되지만 추가 생산성을 느낄 수있을 정도로 지식이 확산 될 때까지 시간이 걸릴 것입니다. 그런 다음 팀이 나뉘어지고 초기의 분위기와 마찬가지로 전체 시스템에 대한 지속적인 개요가 희석됩니다. 이로 인해 한때 단순한 문제였던 코드가 지나치게 복잡해 졌을 수 있습니다.

파이썬으로 작업을 수행하는 빠르고 쉬운 방법은 거의 항상 있지만 시스템이 특정 임계 값에 도달하면 복잡성을 확인하기가 더 어려울 수 있습니다.

요컨대, 둘 다 어두운면을 가지고 있으며 둘 다 명확한 강도를 가지고 있습니다. 그러나 두 커뮤니티를 따라 갈 때 하나의 강도가 다른 쪽의 어두운면으로 이어지고 그 반대의 경우도 있습니다.

따라서 어느 것이 가장 좋은지에 대한 격렬한 논쟁.


14

그래서 메소드와 변수의 가시성을 설정하는 것에 대한 모든 것을 알고 있습니까? 예, 더 이상 존재하지 않습니다. 모든 것이 공개됩니다. 명명 규칙과 이름 맹 글링이 있지만 모든 것을 실제로 사용할 수 있습니다.

파이썬의 유연성 중 일부는 거의 모든 것을 할 수 있다는 사실에서 비롯됩니다. 이 때문에 사람들은 메소드가 올바르게 사용되도록하는 API보다는 API를 사용하는 방법을 알아야한다는 철학이 있습니다.

메소드 오버로드 대신 기본 변수가 있습니다. 변경 가능한 객체를 기본값으로 사용하지 마십시오.

# bad
def fL(x=[])
  x.append(1)
  print x
# good
def fN(x=None)
  if (x is None):
    x = []
  x.append(1)
  print x

fL()
fL()
fN()
fN()

클래스와 인스턴스 변수의 차이는 처음 시작할 때 매우 미묘합니다.

class Obj(object):
   thing = "class variable"
   def __init__(self):
      self.thing1 = "instance variable"
      print self.thing, self.thing1

이것들은 내가 스위치를 만들 때 익숙해 져야 할 것들입니다.


1
내가 전에 알고
Anto

6

파이썬에는 인터페이스가없고 메타 클래스도 있고 오리 타이핑도 허용합니다. 파이썬에는 목록 이해력이 있습니다. 이것은 매우 강력하고 Java에는 존재하지 않습니다. Java에는 많은 데이터 구조가있는 풍부한 유형 시스템이 있으며 Python에는 목록이 있습니다. 따라서 파이썬에서 Java가 가지고있는 것을 재생성하는 대신 Python 이하는 일을 활용하고 있다면 아마도 Python 코드를 작성하고있을 것입니다.

그러나 OO 코드가 진행되는 한, 언어에서 언어로 바뀌지 않아야하는 특정 스타일 기본 사항이 있습니다. Applescript, Python, Java 또는 C ++로 작성하든 항상 Shy 및 DRY 인 코드를 작성하려고 노력해야합니다.

----편집하다----

@delnan이 지적했듯이 실제로 커널 수준에서 파이썬에 의해 정의 된 5 가지 복합 데이터 유형이 있습니다 (목록, dict, tuple, set 및 frozenset, 필자의 "Python in a Nutshell"에 따르면). 이것은 사실이지만 실제로 내가 만들고자하는 요점과 관련이 없습니다. Python은 목록을 필수 데이터 구조로 작성합니다. 예, 목록을 스택으로 사용할 수 있지만 대기열 과 동일한 목록을 사용할 수 있습니다 . 그리고 다시 스택.

반면 Java는 하나의 커널 데이터 구조 ( "Java 포켓 가이드"에 따르면 배열)를 갖지만 일반적으로 컬렉션을 가져 오지 않으면 Java로 많은 작업을 수행 할 수 없습니다. 파이썬의 목록과 동일한 기능을 얻을 수있는 '풍부한'(엄격히 복잡한 의미) 유형 라이브러리에.

물론 두 언어에는 클래스가 있고 Java에는 인터페이스가 있지만 복합 데이터 유형이지만 실제로는 교과서 적 의미의 데이터 구조는 아닙니다.

한 가지 차이점은 Java Queue에서 항목을 팝업 할 수없고 Java Linked List가 필요한 곳에서는 Java Queue 객체를 전달할 수 없다는 것입니다. 아마 "풍부한"이라는 말은 실제로 "단단함"을 의미합니다.

"Python just lists have"라는 말로 의미하는 바를 설명하기 위해, Pythons List 유형을 사용하여 Java Collections로 수행 할 수있는 모든 작업을 Python에서 수행 할 수 있습니다. 이 단일 유형은 Java에서 많은 유형의 작업을 수행합니다.

이것은 파이썬 프로그래머에게 무엇을 의미합니까? 즉, 추가 라이브러리를 사용하지 않고도 파이썬리스트 유형을 사용하여 매우 간결하고 직접적인 코드를 작성할 수 있으며, 피티 니스 (즉, 더 적은 문자로 더 많은 가치를 전달하는 특성)는 "피 토닉"코드의 핵심 특성입니다. .


나는 메타 클래스를 제외한 모든 것에 익숙하다. 감사합니다 :)
Anto

7
다음을 설명 할 수있을 때까지 -1 : (1) "Python에는 목록 만 있습니다"-Python에는 다양한 데이터 구조가 있습니다. 지금까지 생각한 모든 단일 데이터 구조에 대해 세 가지 구현이 없지만 여전히 대부분의 사람들이 필요로하는 모든 것입니다. (2) Java 타입 시스템을 "풍부하게"라고 부르는 것은 정말 정교한 타입 시스템 의 조롱이다 . 우선 , Haskell (확장자가없는 98)을보십시오.

죄송합니다. 사실이 아닙니다. 파이썬은 정확히 두 가지 데이터 구조를 가지고 있습니다 :리스트와 사전. 일부 Python 라이브러리는 이러한 핵심 구조를 확장 할 수 있지만 언어에 해당 구조가 있다고 말하는 것과 다릅니다.
철학자

5
그것은 이미 답변 이름의 두 배입니다. 목록은 스택으로 두 배가됩니다. 세트와 튜플도 내장되어 있습니다 (Java에 몇 개의 데이터 구조가 내장되어 있습니까?). 표준 라이브러리 에는 (최소) 힙, 큐, 변경 불가능한 레코드 및 밀접하게 묶여있는 동종 배열 (C로 제한됨)을위한 모듈도 있습니다 유형). 그리고 그것은 내 머리 꼭대기에서 나온 것입니다. 예, 대부분의 사람들은 내부적으로 목록 / 딕션을 사용합니다 (그러나 세트는 사용되지 않은 키가있는 dict가 아닙니다). 그러나 Java의 대부분의 콜렉션은 사실 모든 언어로되어 있습니다. 그것이 작동하는 방식입니다.

1
이제 나는 당신이 만들려고했던 요점을 이해한다고 생각합니다 (그리고 내 공감대를 제거했습니다-처음에 추가 된 부분 은 원래 언급 된 방식으로 잘못 되었기 때문에 처음에 추가했습니다 ). 나는 여전히 적어도 두 개의 데이터 구조 (거의 보편적 시퀀스로 나열하고 거의 보편적 인 맵핑으로 표시)를 고려해야한다고 생각합니다. 그리고 그것은 적어도 반복자와 목록으로 자주 사용하는 다양한 반복자와 생성기를 언급하지는 않습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.