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.

Item 30: Considere usar @property em vez de

refatorar atributos

O decorador @property facilita que os acessos simples aos atributos de uma

instância possam agir de forma inteligente (consulte o Item 29: “Use atributos

comuns em vez dos métodos get e set”). Um uso bastante comum, mas

absolutamente avançado, para @property é a transformação do que antes era um

simples atributo numérico para um uma entidade que faz cálculos imediatos.

Uma implementação dessas é extremamente útil porque permite migrar todo o

comportamento de uma classe e criar comportamentos inteiramente novos sem

ter que reescrever nenhum dos trechos de código que chamam a classe. A

implementação também é um importante tampão para a evolução das interfaces

da classe durante sua vida útil.

Por exemplo, digamos que se queira implementar uma rotina de limitação de

quota usando a metáfora do balde furado (leaky bucket 1 ) empregando apenas

objetos simples do Python. No código de exemplo a seguir, a classe Bucket

representa quanto da quota ainda pode ser utilizada e a duração na qual a quota

estará disponível:

class Bucket(object):

def __init__(self, period):

self.period_delta = timedelta(seconds=period)

self.reset_time = datetime.now()

self.quota = 0

def __repr__(self):

return 'Bucket(quota=%d)' % self.quota

O algoritmo leaky bucket garante que, sempre que o balde estiver

completamente cheio, a quantidade de quota disponível não é rolada de um

período para o próximo.

def fill(bucket, amount):

now = datetime.now()

if now - bucket.reset_time > bucket.period_delta:

bucket.quota = 0

bucket.reset_time = now

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!