Abstraindo o tipo de uma propriedade

5

Em Python, felizmente, na maioria das vezes, você não precisa escrever getters e setters para obter acesso às propriedades da classe. Dito isso, às vezes você terá que lembrar que uma certa propriedade é uma lista ou algo assim e uma propriedade salvaria você lá, abstraindo o tipo e fornecendo um setter para adicionar algo a essa lista, por exemplo, em vez de expor a lista diretamente.

Onde você desenha a linha entre expor o tipo diretamente ou agrupar seu acesso em uma propriedade? Qual é o conselho geral "pythonic"?

    
por Lorenzo 09.08.2012 / 15:22
fonte

2 respostas

3

Eu tenho tido uma luta interna com código "Pythonic" versus código "bem arquitetado" (bem, em um sentido acadêmico de qualquer maneira) por um tempo. Quanto mais tempo eu gasto escrevendo código Python em uma capacidade profissional (e mexendo com OSS), mais eu percebo que ser "Pythonic" às vezes é jogar fora tudo o que você aprendeu sobre OOP "correto".

Nada no Python é verdadeiramente privado. Como tal, não há razão para ter getters e setters. Sim, você pode usar decoradores ( @property , etc), mas eu encontrei pouco uso para eles além de inchar meu código (e eles são muito usados em qualquer código que eu seja) ve olhou através).

Quanto à verificação de tipos, confio no usuário do código para ser inteligente o suficiente para saber o que está fazendo. Se eles usarem um tipo incorreto, em algum lugar abaixo da linha, eles serão apresentados a um erro de tempo de execução que deve ser fácil de depurar com o pdb (ou óbvio com a mensagem de erro). Novamente, código inchaço.

Tendo dito isso, se houver algo que o código do cliente deve ser informado em tempo de execução (conteúdo orientado a dados, etc), usarei assert , que pode ser desativado em um ambiente não-debug com a flag -O do Python .

O "melhor" código Python pode ser facilmente grokked. Quanto menos código você escrever (ou quanto mais você excluir), mais fácil será entender seu código. Como um plug sem vergonha para uma biblioteca que escrevi, implementei um cliente OAuth 2.0 que funciona em todos os fluxos do lado do servidor e oferece suporte a vários provedores prontos para uso em 66 LOC . Comparado com uma das primeiras revisões em ~ 450 LOC, isso é muito fácil de entender;)

Afinal de contas .. Estamos todos consentindo adultos aqui .

    
por 29.08.2012 / 21:49
fonte
0

Evite expor membros da turma ao mundo exterior. Use getters / setters em vez disso.

O tipo do membro real é desconhecido fora da classe e você pode ter vários setters que configuram o mesmo membro. Cada setter pode receber parâmetros diferentes e fazer a conversão.

Eu não conheço Phyton, mas posso dar um exemplo em pseudocódigo:

public class MyClass {
    private String a;

    private List<String> l = new ArrayList<String>();

    public void setA(String newValue){
        this.a = newValue;
    }

    public void setA(int newValue){
        this.a = ""+newValue;  // convert to string
    }

    public void addL(String newValue){
        l.add(newValue);
    }
}

Você pode fazer isso com uma instância dessa classe:

object.setA(1);
object.setA("xx");
object.addL("yy");
    
por 29.08.2012 / 21:34
fonte

Tags