15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

@property

def ohms(self):

self.voltage = self._ohms * self.current

return self._ohms

# ...

O comportamento resultante é extremamente bizarro.

r7 = MysteriousResistor(10)

r7.current = 0.01

print('Before: %5r' % r7.voltage)

r7.ohms

print('After: %5r' % r7.voltage)

>>>

Before: 0

After: 0.1

A melhor política aqui é apenas modificar estados relacionados em um objeto em

métodos @property.setter. Evite a todo custo qualquer outro efeito colateral que

pode ser uma surpresa para o chamador quando constrói o objeto, como a

importação dinâmica de módulos, a execução de funções auxiliares muito lentas

ou buscas muito pesadas no banco de dados. Os usuários da sua classe esperam

que seus atributos funcionem como em qualquer outro objeto do Python:

rapidamente e de forma fácil. Use métodos normais para desempenhar qualquer

tarefa que seja mais complexa ou lenta.

Lembre-se

• Defina novas interfaces de classe usando atributos públicos simples, e fuja de

métodos com funcionalidades de set e get.

• Use @property para definir qualquer comportamento especial disparado

quando os atributos do objeto são acessados, se necessário.

• Seja a regra da menor surpresa e evite efeitos colaterais esquisitos em seus

métodos de @property.

• Garanta que os métodos de @property sejam rápidos; para tarefas que sejam

lentas ou complexas, use métodos normais.

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!