Python類別屬性的延遲計算

WBOY
發布: 2016-12-05 13:27:16
原創
1256 人瀏覽過

所謂類別屬性的延遲計算就是將類別的屬性定義成一個property,只在存取的時候才會計算,而且一旦被存取後,結果將會被快取起來,不用每次都計算。

優點

構造一個延遲計算屬性的主要目的是為了提升效能

實現

class LazyProperty(object):
  def __init__(self, func):
    self.func = func

  def __get__(self, instance, owner):
    if instance is None:
      return self
    else:
      value = self.func(instance)
      setattr(instance, self.func.__name__, value)
      return value


import math


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  @LazyProperty
  def area(self):
    print 'Computing area'
    return math.pi * self.radius ** 2

  @LazyProperty
  def perimeter(self):
    print 'Computing perimeter'
    return 2 * math.pi * self.radius

登入後複製

說明

定義了一個延遲計算的裝飾器類別LazyProperty。 Circle是用來測試的類,Circle類有是三個屬性半徑(radius)、面積(area)、週長(perimeter)。面積和周長的屬性被LazyProperty裝飾,下面來試試LazyProperty的魔法:

>>> c = Circle(2)
>>> print c.area
Computing area
12.5663706144
>>> print c.area
12.5663706144
登入後複製

在area()中每計算一次就會打印一次“Computing area”,而連續調用兩次c.area後“Computing area”只被打印了一次。這得歸功於LazyProperty,只要呼叫一次後,無論後續呼叫多少次都不會重複計算。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!