Pergunta

Usar get/set parece ser uma prática comum em Java (por vários motivos), mas dificilmente vejo código Python que use isso.

Por que você usa ou evita métodos get/set em Python?

Foi útil?

Solução

Link legal: Python não é java :)

Em Java, você precisa usar getters e setters, porque o uso de campos públicos não oferece nenhuma oportunidade de voltar e mudar de idéia posteriormente para usar getters e setters. Então, em Java, você também pode tirar a tarefa do caminho na frente. No Python, isso é bobo, porque você pode começar com um atributo normal e mudar de idéia a qualquer momento, sem afetar nenhum cliente da classe. Então, não escreva getters e setters.

Outras dicas

Em python, você pode acessar o atributo diretamente porque é público:

class MyClass:

    def __init__(self):
        self.my_attribute = 0  

my_object = MyClass()
my_object.my_attribute = 1 # etc.

Se você quiser fazer algo sobre acesso ou mutação do atributo, você pode usar propriedades:

class MyClass:

    def __init__(self):
        self._my_attribute = 0

    @property
    def my_attribute(self):
        # Do something if you want
        return self._my_attribute

    @my_attribute.setter
    def my_attribute(self, value):
        # Do something if you want
        self._my_attribute = value

Crucialmente, o código do cliente permanece o mesmo.

Aqui está o que Guido van Rossum diz sobre isso em Masterminds de programação

O que você quer dizer com "lutar contra o idioma"?

Guido: Isso geralmente significa que eles estão tentando continuar seus hábitos que funcionavam bem com um idioma diferente.

...] As pessoas transformarão tudo em uma aula e transformarão todo acesso em um método de acessador,
Onde isso não é realmente uma coisa sábia a fazer em Python; você terá mais código detalhado que é
Mais difícil de depurar e corre muito mais lento. Você conhece a expressão "Você pode escrever fortran em algum idioma?" Você também pode escrever Java em qualquer idioma.

Não, é impeficial. A maneira geralmente aceita é usar o atributo de dados normais e substituir os que precisam de lógica GET/Set mais complexos pelas propriedades.

Se você não se importar em suportar versões antigas do Windows (anterior ao Windows XP SP1), você poderia usar GetSystemTimes Win32 API Função . <.

Sua observação está correta. Este não é um estilo normal de programação python. Os atributos são todos públicos, então você acessa (obtenha, defina, exclui) como faria com atributos de qualquer objeto que os tenha (não apenas aulas ou instâncias). É fácil dizer quando os programadores Java aprendem Python porque seu código Python se parece com Java usando a sintaxe do Python!

Definitivamente, concordo com todos os pôsteres anteriores, especialmente o link de Maximiliano com o famoso artigo de Phillip e @Sugestão de Max de que qualquer coisa mais complexa do que a maneira padrão de definir (e obter) atributos de classe e instância é usar propriedades (ou descritores para generalizar ainda mais) para personalizar a obtenção e a definição de atributos! (Isso inclui poder adicionar suas próprias versões personalizadas de privado, protegido, amigo ou qualquer política que você queira, se desejar algo que não seja público.)

Como uma demonstração interessante, em Programação Python Core (Capítulo 13, Seção 13.16), criei um exemplo de uso de descritores para armazenar atributos para o disco, em vez de na memória !! Sim, é uma forma estranha de armazenamento persistente, mas faz Mostre a você um exemplo do que é possível!

Aqui está outro post relacionado que você pode achar útil também:Python: Múltiplas propriedades, um setter/getter

Eu vim aqui para essa resposta (infelizmente não pude). Mas eu encontrei um Gambiarra em outro lugar . Este código abaixo pode ser alternativo para pegue .
class get_var_lis: def __init__(self): pass def __call__(self): return [2,3,4] def __iter__(self): return iter([2,3,4]) some_other_var = get_var_lis
Isso é apenas um Gambiarra . Ao usar o conceito acima, U poderia facilmente criar metodologia GET/Set em PY também.

Nosso professor mostrou um exemplo na aula explicando quando devemos usar as funções de acessador.

class Woman(Human):
    def getAge(self):
        if self.age > 30:
            return super().getAge() - 10
        else:
            return super().getAge()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top