例如我们现在要实现一个ProxyProvider类,它读取 Redis,获取最新的代理 IP,然后随机返回一条。另外有一个程序,会增加新的代理 IP 到 Redis 中。但频率不高。
所以,ProxyProvider这个类,不需要每次获取 IP 的时候都读取数据库,每小时读取一次就可以了。如果不用@property装饰器,你可能会这样写代码:
import time import random
class ProxyProvider: def __init__(self): self.pool = [] self.last_update_time = 0
def get_proxy(self): now = time.time() if now - self.last_update_time > 3600 or not self.pool: self.pool = self.get_all_proxies_from_redis() return random.choice(self.pool)
如果你经常看 Java 代码,你会发现大量的这种get_xxx、set_xxx的写法。
于是,调用的时候,要这样调用:
provider = ProxyProvider() provider.get_proxy()
如果用@property,那么代码可以改写为:
import time import random
class ProxyProvider: def __init__(self): self.pool = [] self.last_update_time = 0
@property def proxy(self): now = time.time() if now - self.last_update_time > 3600 or not self.pool: self.pool = self.get_all_proxies_from_redis() return random.choice(self.pool)
@property def proxy(self): now = time.time() if now - self.last_update_time > 3600 or not self.pool: self.pool = self.get_all_proxies_from_redis() return random.choice(self.pool + list(self.special))
@proxy.setter def proxy(self, value): if not value.startswith('http'): proxy = f'http://{ip}' if proxy in self.special_ip: return self.special_ip.add(proxy)