Em geral, estou confuso sobre a diferença entre uma "propriedade" e um "atributo" e não consigo encontrar um ótimo recurso para detalhar concisamente as diferenças.
146
Propriedades são um tipo especial de atributo. Basicamente, quando o Python encontra o seguinte código:
spam = SomeObject()
print(spam.eggs)
parece-se eggs
em spam
, em seguida, examina eggs
para ver se ele tem uma __get__
, __set__
ou __delete__
método - se isso acontecer, é uma propriedade. Se for uma propriedade, em vez de apenas retornar o eggs
objeto (como seria para qualquer outro atributo), ele chamará o __get__
método (desde que estávamos fazendo pesquisa) e retornará o que esse método retornar.
Mais informações sobre o modelo de dados e descritores do Python .
Com uma propriedade, você tem controle total sobre seus métodos getter, setter e deleter, que você não possui (se não estiver usando advertências) com um atributo.
fonte
x
. Mão única. Se o usuário da classe descobrir sobre _x, eles o usarão por sua conta e risco.Em termos gerais, uma propriedade e um atributo são a mesma coisa. No entanto, existe um decorador de propriedades no Python que fornece acesso ao getter / setter a um atributo (ou outros dados).
fonte
A propriedade permite que você obtenha e defina valores como faria com atributos normais, mas abaixo existe um método chamado de conversão para um getter e setter para você. É realmente apenas uma conveniência reduzir o clichê de chamar getters e setters.
Digamos, por exemplo, que você teve uma aula que realizou algumas coordenadas xey para algo que você precisava. Para defini-los, você pode fazer algo como:
É muito mais fácil olhar e pensar do que escrever:
O problema é: e se um dia sua classe mudar de forma que você precise compensar x e y por algum valor? Agora você precisaria alterar sua definição de classe e todo o código que a chama, o que poderia ser realmente demorado e propenso a erros. A propriedade permite que você use a sintaxe anterior, oferecendo a flexibilidade de alterar o último.
No Python, você pode definir getters, setters e excluir métodos com a função de propriedade Se você deseja apenas a propriedade read, também existe um decorador @property que você pode adicionar acima do seu método.
http://docs.python.org/library/functions.html#property
fonte
Eu aprendi duas diferenças no site de Bernd Klein, em resumo:
1. Propriedade é uma maneira mais conveniente de encapsular dados.
ex: se você tem um atributo público de comprimento de objeto, mais tarde, seu projeto exige que você o encapsule, ou seja: mude para privado e forneça getter e setter => você precisará alterar muitos dos códigos que escreveu antes:
Se você usar @property e @ lenght.setter =>, não precisará alterar esses códigos antigos
2. Uma propriedade pode encapsular vários atributos
Neste exemplo,
__physic_health
e__mental_health
são privados e não podem ser acessados diretamente de fora, a única maneira de a classe externa interagir com eles é através da propriedadecondition
fonte
Também há uma diferença não óbvia que eu uso para armazenar em cache ou atualizar dados; geralmente, temos uma função conectada ao atributo de classe. Por exemplo, eu preciso ler o arquivo uma vez e manter o conteúdo atribuído ao atributo para que o valor seja armazenado em cache:
Resultado:
Acessamos o atributo duas vezes, mas nossa função foi acionada apenas uma vez. Alterar o exemplo acima para usar a propriedade fará com que o valor do atributo seja atualizado sempre que você o acessar:
Resultado:
fonte