Diferenças entre "Java OOP" e "Python OOP"? [fechadas]

19

Comecei com o ActionScript 2.0 e depois continuei com o Java. Eu aprendi, ou pelo menos usei, várias linguagens desde então, incluindo Python (provavelmente o meu favorito).

Receio que meu estilo de programação orientada a objetos seja muito pouco sintético e mais parecido com o Java OOP com sintaxe Python. O que faz o Java gostar e o Pythonic OOP diferirem um do outro? Quais são as coisas que os programadores Java costumam fazer "não-pythonically" ao escrever código orientado a objetos em Python?

Anto
fonte

Respostas:

54

Para um cara Java, o Python é um campo de jogos anárquico, onde qualquer um pode agarrar um clube e começar a atacar sua cabeça.

Para um cara Python, Java é um universo orwelliano, onde você está constantemente acorrentado à visão cada vez menor de como o universo funciona.

A verdade é tudo o que você pode fazer em um idioma e no outro da mesma forma limpa. No entanto, como você mencionou, existem diferenças importantes na comunidade quanto ao que significa limpar .

Maneira Java: Um sistema limpo é aquele que faz o que se destina e nada mais, não permitirá extensões ou modificações que vão contra a natureza do objetivo pretendido e tentará aplicá-las o máximo possível através do compilador. A flexibilidade é obtida através da criação cuidadosa de interfaces simples dentro de estruturas rígidas. No Java, a caixa de areia deve sempre ser claramente delimitada e ultrapassar esses limites com o rápido feedback do compilador. Java fornece meios para definir estaticamente estruturas de objetos e criar interações dinâmicas a partir de instâncias delas. Quando trabalho em Java, tento criar, de maneira inteligente, blocos de construção básicos para uma solução com morte cerebral. Eu trabalho de baixo para cima principalmente quando tenho uma teoria de trabalho sobre como lidar com o problema.

Java tenderá a produzir software grande que pode abranger grandes equipes e fornecer ferramentas e meios para manter o rebanho sob controle. Se mantido desmarcado, isso fará com que equipes muito desapegadas trabalhem de forma independente em direção a um objetivo cada vez mais incerto. Eventualmente, cada equipe se torna sua própria "raison d'être" e o sistema como um todo se dilui, desviando o projeto principal. Isso pode levar a extremos de custos extremos e a enormes sistemas de software com desempenho e manutenção ruins.

Quase nunca existe uma maneira rápida e fácil de fazer as coisas em Java, mas o IDE e as ferramentas estão lá para tornar tarefas difíceis a apenas alguns cliques.

Maneira Python: Clean significa conciso e facilmente legível. Um bom sistema python foi projetado para permitir que você chegue ao âmago dele e exponha seus segredos mais íntimos de uma maneira que você possa entender a partir do código o uso e a finalidade pretendidos. Ele também permitirá que você projete sua própria solução estendendo e / ou encapsulando o design original para que ele siga exatamente na sua direção. O Python fornece meios para criar modelos de objetos a partir dos quais você pode alterar dinamicamente a instância para atender às necessidades em questão. Em python, costumo resolver o problema imediatamente e depois espalhar o código em uma estrutura lógica, para que a solução final permaneça o mais simples e legível possível. Em python, costumo trabalhar de cima para baixo e gerenciar as complexidades de aumento por meio de uma abordagem de dividir e conquistar.

As equipes de Python tendem a produzir sistemas leves e são muito rápidas na entrega de uma solução funcional. Eles tenderão a ser um grupo unido trabalhando de maneira intercambiável em qualquer parte do sistema, validando a solução um do outro a cada chance que tiverem. Eles se alimentam criando uma sinergia que é bastante emocionante. No entanto, isso cria equipes difíceis de escalar para sistemas maiores e geralmente atingem uma espécie de teto de vidro. A introdução de novos membros na equipe ajudará, mas levará algum tempo para que o conhecimento se espalhe o suficiente para que a produtividade extra seja sentida. A equipe então se divide e a visão geral constante de todo o sistema se dilui, assim como a atmosfera dos primeiros dias. Isso pode levar a códigos excessivamente complicados para o que antes era um problema simples,

Quase sempre existe uma maneira rápida e fácil de fazer as coisas com o Python, mas a complexidade pode ser mais difícil de controlar quando o sistema atinge um determinado limite.

Em suma, ambos têm um lado sombrio e ambos têm força clara. No entanto, ao insistir nas duas comunidades, você descobrirá que a força de uma leva ao lado sombrio da outra e vice-versa.

Daí os debates acalorados sobre qual é o melhor.

Newtopian
fonte
14

Então você sabe tudo sobre como definir a visibilidade de métodos e variáveis? Sim, eles não existem mais, tudo é público. Existem convenções de nomes e nomes diferentes, mas tudo ainda está disponível.

Parte da flexibilidade do Python vem do fato de você poder fazer quase qualquer coisa. Por esse motivo, a filosofia é que as pessoas devem saber como usar a API, em vez de a API impor que um método seja usado corretamente.

Em vez de sobrecargas de método, você tem variáveis ​​padrão. Não use objetos mutáveis ​​como seu valor padrão.

# 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()

A diferença entre variáveis ​​de classe e instância é muito sutil quando você começa.

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

Essas são algumas das coisas com as quais eu me acostumei quando fiz a troca.

unholysampler
fonte
1
+1 bom resumo de algumas coisas, embora eu soubesse que os de antes
Anto
6

Bem, o Python não possui interfaces, possui metaclasses e permite a digitação de patos. O Python possui compreensão de lista, que é muito poderosa e não existe em Java. Java tem um sistema de tipo rico com muitas estruturas de dados e Python apenas possui listas. Portanto, se você está aproveitando o que o Python possui em vez de tentar recriar o que o Java possui no Python, provavelmente está escrevendo código Pythonic.

Mas, no que diz respeito ao código OO, existem certos princípios básicos de estilo que não devem mudar de idioma para idioma: você sempre deve escrever um código que seja tímido e seco, esteja você escrevendo em Applescript, Python, Java ou C ++.

----Editar----

Como o @delnan salienta, existem na verdade CINCO tipos de dados compostos definidos pelo Python no nível do Kernel (lista, dict, tuple, set e frozenset, de acordo com minha cópia do "Python in a Nutshell"). Embora isso seja verdade, não é realmente relevante ao ponto que estou tentando enfatizar: o Python se baseia em listas como a estrutura de dados essencial. Sim, você PODE usar uma lista como uma pilha, mas você pode usar exatamente a mesma lista que uma fila. E então uma pilha novamente.

Java, por outro lado, possui uma estrutura de dados do kernel (Array, de acordo com "O Java Pocket Guide), mas, em geral, você não pode fazer muito em Java sem importar coleções. Depois de fazer isso, você tem acesso para uma biblioteca de tipos 'rica' (nesse sentido, imensamente complexa) com a qual obter a mesma funcionalidade que você possuía na lista do Python.

Obviamente, ambas as linguagens têm classes e Java possui interfaces, mas, embora sejam tipos de dados compostos, elas não são realmente estruturas de dados no sentido de livros didáticos.

Uma diferença é que você não pode exibir um item de uma fila do Java e não pode passar um objeto da fila do Java para algum lugar que esteja esperando uma lista vinculada do Java. Então, talvez por "rico" eu realmente queira dizer "rígido".

Então, para explicar o que quero dizer com "Python apenas possui listas", o que quero dizer é que você pode fazer praticamente tudo o que precisa fazer em Python, o que faria com Java Collections usando o tipo Pythons List. Esse tipo único faz o trabalho de muitos tipos em Java.

O que isso significa para o programador Python? Isso significa que você pode alavancar o tipo Python List para escrever código direto muito conciso sem o uso de bibliotecas adicionais - e a concisão (isto é, a característica de transmitir mais valor em menos caracteres) é uma característica principal do código "Pythonic" .

philosodad
fonte
Eu estou familiarizado com tudo, exceto metaclasses, procurá-los. Obrigado :)
Anto 28/03
7
-1 até que você possa explicar o seguinte: (1) "Python apenas possui listas" - o Python possui diversas estruturas de dados. Ele não possui três implementações de todas as estruturas de dados já concebidas, mas ainda sobre todas as que a maioria das pessoas precisará. (2) Chamar o sistema de tipos de Java de "rico" é uma zombaria daqueles sistemas de tipos realmente sofisticados. Para iniciantes , consulte Haskell (98 sem extensões).
Sinto muito, isso simplesmente não é verdade. O Python possui exatamente duas estruturas de dados: Listas e Dicionários. Alguns Python LIBRARIES podem estender essas estruturas principais, mas isso não é o mesmo que dizer que a linguagem as possui.
philosodad
5
Isso já é o dobro do nome das respostas. A lista dobra como pilha. Conjuntos e tuplas também são integrados (quantas estruturas de dados são incorporadas ao Java?) Existem também módulos na biblioteca padrão para (min) montões, deques, registros imutáveis ​​e matrizes homogêneas compactas (restritas a C tipos). E isso é apenas do topo da minha cabeça. Sim, a maioria deles usa listas / dictos internamente (no entanto, conjuntos não são dictos com chaves não utilizadas). Mas o mesmo acontece com a maioria das coleções em Java - de fato, em todas as linguagens. É assim que funciona.
1
Agora acho que entendi o argumento que você tentou fazer (e removi meu voto negativo - que eu adicionei em primeiro lugar porque essa parte estava completamente errada da maneira como foi originalmente declarada). Ainda acho que você precisa considerar pelo menos duas estruturas de dados (listas como sequências quase universais e dictos como mapeamentos quase universais). E isso sem mencionar os vários iteradores e geradores, que eu uso pelo menos com (e provavelmente ainda mais) freqüentemente como listas.