SORU
10 HAZİRAN 2010, PERŞEMBE


Python tembel özelliği dekoratör

Son zamanlarda mevcut kod tabanı inceledim ve örnek bir sürü tembel, yani öznitelikleri refactored. kurucu başlatılmalı ama sadece üzerine ilk okuma değil. Bu öznitelikler örneğinin ömrü boyunca değişmez, ama bu ilk kez ve sadece özel durumlar için erişilebilir hesaplamak için gerçek bir darboğaz yapıyorlar.

Aşağıdaki kod parçası, tekrar tekrar çeşitli sınıflar arasında: çeşitli öznitelikleri için kendimi yazarak buluyorum

class testA(object):

  def __init__(self):
    self._a = None
    self._b = None

  @property
  def a(self):
    if self._a is None:
      # Calculate the attribute now
      self._a = 7
    return self._a

  @property
  def b(self):
    #etc

Sadece haberim olmayan varolan bir dekoratör bunu yapmak için zaten Python var mı? Ya da, orada oldukça kolay bir yolu yok bu bir dekoratör tanımlamak için?

Python 2.5, 2.6 ama cevap hala önemli ölçüde farklıysa ilginç olabilir altında çalışıyorum.

CEVAP
10 HAZİRAN 2010, PERŞEMBE


İşte boilerplace kaldırır tembel özelliği dekoratör için örnek bir uygulama:

def lazyprop(fn):
    attr_name = '_lazy_'   fn.__name__
    @property
    def _lazyprop(self):
        if not hasattr(self, attr_name):
            setattr(self, attr_name, fn(self))
        return getattr(self, attr_name)
    return _lazyprop


class Test(object):

    @lazyprop
    def a(self):
        print 'generating "a"'
        return range(5)

İnteraktif oturum:

>>> t = Test()
>>> t.__dict__
{}
>>> t.a
generating "a"
[0, 1, 2, 3, 4]
>>> t.__dict__
{'_lazy_a': [0, 1, 2, 3, 4]}
>>> t.a
[0, 1, 2, 3, 4]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Griffin Gibson

    Charles Grif

    26 NİSAN 2006
  • metallmanutza13

    metallmanutz

    13 NİSAN 2007
  • Videogamerz | Call of Duty

    Videogamerz

    5 NİSAN 2012