15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

validação imediatamente antes de se iniciar a construção propriamente dita do

objeto.

@property pode ser usada até mesmo para transformar em imutáveis os atributos

da classe-mãe.

class FixedResistance(Resistor):

# ...

@property

def ohms(self):

return self._ohms

@ohms.setter

def ohms(self, ohms):

if hasattr(self, '_ohms'):

raise AttributeError("Can't set attribute")

self._ohms = ohms

Atribuir um valor à propriedade depois que o objeto tiver sido construído

também levanta uma exceção.

r4 = FixedResistance(1e3)

r4.ohms = 2e3

>>>

AttributeError: Can't set attribute

A grande desvantagem de @property é que os métodos para um atributo só

podem ser compartilhados por subclasses. Classes não relacionadas não podem

usar a mesma implementação. Entretanto, o Python suporta também os

chamados descritores ou descriptors (consulte o Item 31: “Use descritores para

implementar métodos reutilizáveis de @property”) que permitem reutilização de

lógica ligada a propriedades e muitos outros casos.

Por fim, quando usamos métodos de @property para implementar setters e

getters, precisamos nos certificar de que o comportamento implementado não

seja surpreendente. Por exemplo, jamais atribua valores com set a outros

atributos em métodos que leem propriedades com get.

class MysteriousResistor(Resistor):

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!